Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5)
Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5)
import android.content.ClipData
import android.graphics.Canvas
import android.graphics.Point
import android.os.Bundle
import android.util.Log
import android.view.DragEvent
import android.view.LayoutInflater
import android.view.View
import android.view.View.OnDragListener
import android.view.View.OnLongClickListener
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCornersclass MainActivity : AppCompatActivity() {companion object {const val TAG = "fly"const val DEGREE = -10 //图片选择的角度。const val RADIUS = 30 //图片的圆角半径。}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val shadowBuilder = createDragShadowBuilder()setData(shadowBuilder.getShadowView())val triggerView = findViewById<ImageView>(R.id.image)triggerView.setOnLongClickListener(object : OnLongClickListener {//长按事件触发拖拽.override fun onLongClick(v: View?): Boolean {val data = ClipData.newPlainText("name", "phil") //测试数据。triggerView.startDragAndDrop(data,shadowBuilder,null,0 or View.DRAG_FLAG_GLOBAL or View.DRAG_FLAG_OPAQUE)return true}})triggerView.setOnDragListener(object : OnDragListener {override fun onDrag(v: View?, event: DragEvent?): Boolean {when (event?.action) {DragEvent.ACTION_DRAG_STARTED -> {//拖放开始Log.d(TAG, "ACTION_DRAG_STARTED")//updateData(shadowView)}DragEvent.ACTION_DRAG_ENTERED -> {//进入imageViewLog.d(TAG, "ACTION_DRAG_ENTERED")}DragEvent.ACTION_DRAG_ENDED -> {//拖放结束Log.d(TAG, "ACTION_DRAG_ENDED")}DragEvent.ACTION_DRAG_EXITED -> {//离开imageViewLog.d(TAG, "ACTION_DRAG_EXITED")}}return true}})}private fun createDragShadowBuilder(): MyDragShadowBuilder {val shadowView = LayoutInflater.from(this).inflate(R.layout.dnd, null)return MyDragShadowBuilder(shadowView)}private fun setData(viewGroup: View) {//从1和4两个数字中随机选一个。var cnt = intArrayOf(1, 4).random()Log.d(TAG, "cnt=$cnt")val group: androidx.constraintlayout.widget.Group = viewGroup.findViewById(R.id.group)val number = viewGroup.findViewById<TextView>(R.id.number)if (cnt == 1) {//只显示一张。number.text = "1"group.visibility = ViewGroup.INVISIBLE} else if (cnt == 4) {//显示重叠在一起的4张。number.text = "4"group.visibility = ViewGroup.VISIBLEval imageViews = arrayOf(viewGroup.findViewById<ImageView>(R.id.iv1),viewGroup.findViewById<ImageView>(R.id.iv2),viewGroup.findViewById<ImageView>(R.id.iv3))val resIds = arrayOf(R.mipmap.pic1,R.mipmap.pic2,R.mipmap.pic3)imageViews.forEachIndexed { index, iv ->val degree = (imageViews.size - index) * DEGREELog.d(TAG, "index=$index degree=$degree")iv.rotation = degree.toFloat()GlideApp.with(this).load(resIds[index]).transform(CenterCrop(), RoundedCorners(RADIUS)) //先中心缩放,再切圆角。.override(resources.getDimensionPixelSize(R.dimen.image_size_w),resources.getDimensionPixelSize(R.dimen.image_size_h)).placeholder(R.drawable.ic_launcher_foreground).error(android.R.drawable.stat_notify_error).into(iv)}}val folder = viewGroup.findViewById<ImageView>(R.id.folder)//封面GlideApp.with(this).load(R.mipmap.pic4).transform(CenterCrop(), RoundedCorners(RADIUS)) //先中心缩放,再切圆角。.override(resources.getDimensionPixelSize(R.dimen.image_size_w),resources.getDimensionPixelSize(R.dimen.image_size_h)).placeholder(R.drawable.ic_launcher_foreground).error(android.R.drawable.stat_notify_error).into(folder)}class MyDragShadowBuilder(private var mShadow: View) :View.DragShadowBuilder() {private val width: Int =mShadow.context.resources.getDimensionPixelSize(R.dimen.view_size_w)private val height: Int =mShadow.context.resources.getDimensionPixelSize(R.dimen.view_size_h)fun getShadowView(): View {return mShadow}override fun onProvideShadowMetrics(outShadowSize: Point?, outShadowTouchPoint: Point?) {//拖动图像的宽和高outShadowSize?.set(width, height)//手指在拖动图像的位置 中点outShadowTouchPoint?.set(width / 2, height / 2)}override fun onDrawShadow(canvas: Canvas) {mShadow.measure(width, height)mShadow.layout(0, 0, width, height)mShadow.draw(canvas)Log.d(TAG, "onDrawShadow width=$width height=$height")}}
}
只有一张图片,只显示封面图:

多张图片,显示堆叠的图片,并同时设置封面图:

dnd.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="@dimen/view_size_w"android:layout_height="@dimen/view_size_h"android:background="@android:color/holo_orange_light"><ImageViewandroid:id="@+id/iv1"android:layout_width="@dimen/image_size_w"android:layout_height="@dimen/image_size_h"android:layout_margin="@dimen/my_margin"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/iv2"android:layout_width="@dimen/image_size_w"android:layout_height="@dimen/image_size_h"android:layout_margin="@dimen/my_margin"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/iv3"android:layout_width="@dimen/image_size_w"android:layout_height="@dimen/image_size_h"android:layout_margin="@dimen/my_margin"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><androidx.constraintlayout.widget.Groupandroid:id="@+id/group"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="visible"app:constraint_referenced_ids="iv1,iv2,iv3" /><ImageViewandroid:id="@+id/folder"android:layout_width="@dimen/image_size_w"android:layout_height="@dimen/image_size_h"android:layout_margin="@dimen/my_margin"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/number"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@android:color/holo_red_light"android:text="--"android:textColor="@android:color/white"android:textSize="30dp"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
dimens.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="view_size_w">250dp</dimen><dimen name="view_size_h">200dp</dimen><dimen name="image_size_w">150dp</dimen><dimen name="image_size_h">100dp</dimen><dimen name="my_margin">50dp</dimen>
</resources>
Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View,Kotlin(4)-CSDN博客文章浏览阅读74次。Android DynamicGrid:拖曳交换位置Android DynamicGrid是一个第三方开源项目,DynamicGrid在github上的项目主页是:https://github.com/askerov/DynamicGrid它实现在一个网格布局内,拖曳任意子view实现动态的交换位置,这很类似手机的桌面,手机桌面的图标,均可自由拖曳实现摆放位置的交换,如动图所示:_android 拖拽交换位置。Android View拖拽startDragAndDrop,Kotlin-CSDN博客。https://blog.csdn.net/zhangphil/article/details/134017828
相关文章:
Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5)
Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5) import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import android.view.…...
1994-2021年分行业二氧化碳排放量数据
1994-2021年分行业二氧化碳排放量数据 1、时间:1994-2021年 2、来源:原始数据整理自能源年鉴 3、指标:统计年度、行业代码、行业名称、煤炭二氧化碳排放量、焦炭二氧化碳排放量、原油二氧化碳排放量、汽油二氧化碳排放量、煤油二氧化碳排放…...
如何进行Go程序的打包发布
上一篇,我们已经用GoLand开发了第一个程序Hello Kitty,接下去,我们将完成Go程序的打包发布。 执行: go build -x main.gogo build 和 go run 在编译过程中其实是差不多的,不同之处是 go build 会生成编译好二进制文件并删掉编译…...
python工具HIKVISION视频编码设备接入网关任意文件下载
python工具 构造payload /serverLog/downFile.php?fileName../web/html/serverLog/downFile.php漏洞证明 文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。 免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何…...
[NLP] 使用Llama.cpp和LangChain在CPU上使用大模型
一 准备工作 下面是构建这个应用程序时将使用的软件工具: 1.Llama-cpp-python 下载llama-cpp, llama-cpp-python [NLP] Llama2模型运行在Mac机器-CSDN博客 2、LangChain LangChain是一个提供了一组广泛的集成和数据连接器,允许我们链接和编排不同的模块。可以常…...
开发知识点-Ant-Design-Vue
Ant-Design-Vue a-input a-input Vue组件 a-spin 加载中的效果 data字段 mounted钩子函数 Ant Design Vue 组件库 list-type“picture-card” 上传的图片作为卡片展示 name show-upload-list action :beforeUpload“handleBeforeUpload” :headers“customHeaders” :disabl…...
2022最新版-李宏毅机器学习深度学习课程-P50 BERT的预训练和微调
模型输入无标签文本(Text without annotation),通过消耗大量计算资源预训练(Pre-train)得到一个可以读懂文本的模型,在遇到有监督的任务是微调(Fine-tune)即可。 最具代表性是BERT&…...
Android codec2 视频框架 之输入buffer
文章目录 输入端的内存管理输入数据包buffer结构体的转换 主要的流程如上, 申请内存在CCodecBufferChannel,申请之后回调到MediaCodec。然后应用从MediaCodec获取 将解码数据放到buffer中,CCodecBufferChannel在将这块buffer 送到componet模块…...
Python实现局部二进制算法(LBP)
1.介绍 局部二进制算法是一种用于获取图像纹理的算法。这算法可以应用于人脸识别、纹理分类、工业检测、遥感图像分析、动态纹理识别等领域。 2.示例 """ 局部二进制算法,计算图像纹理特征 """ import cv2 import numpy as np imp…...
如何评价现在的CSGO游戏搬砖市场
如何评价现在的csgo市场? 其实整个搬砖市场,现在已经变得乌烟瘴气,散发着“恶臭”。我个人非常鄙视那些虚有其表,大小通吃的做法,那些甚至连搬砖数据都看不懂的人,也出来吹嘘着“实力强大,经验丰…...
ResourceQuota对象在K8s上的说明
ResourceQuota资源对象的说明,以及在集群中的作用说明 定义说明 https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/ 集群中的资源组的划分和设计 在具有 32 GiB 内存和 16 核 CPU 资源的集群中,允许 A 团队使用 20 GiB 内存 和 10 核…...
悟空crm二次开发 增加客户保护功能 (很久没有消息,但是有觉得有机会的客户)就进入了保护转态
需求:客户信息录入不限数量,但是录入的信息1个月内只有自己和部门领导能看到,如果1个月内未成交或者未转移至自己的客保 则掉入公海所有人可见,这里所说的客保就是现在系统自带的客保 1、需求思维导图 2、新增保护按钮 3、点击该…...
k8s之配置资源管理
一,secret Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。 有三种类型: 1,k…...
赛氪助力全国大学生数学竞赛山东赛区圆满举办
近日,全国大学生数学竞赛山东赛区比赛有序进行,赛氪已连续6年助力本项赛事蓬勃发展。在中国高等教育学会高校竞赛评估与管理体系研究专家工作组发布的《2022全国普通高校大学生竞赛分析报告》中,本赛事荣登观察目录。 全国大学生数学竞赛旨在…...
pytorch基础语法问题
这里写目录标题 pytorch基础语法问题shapetorch.ones_like函数和torch.zeros_like函数y.backward(torch.ones_like(x), retain_graphTrue)torch.autograd.backward参数grad_tensors: z.backward(torch.ones_like(x))来个复杂例子z.backward(torch.Tensor([[1., 0]])更复杂例子实…...
【面试经典150 | 】颠倒二进制位
文章目录 写在前面Tag题目来源题目解读解题思路方法一:逐位颠倒方法二:分治 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于…...
十分钟了解自动化测试
自动化测试 自动化测试的定义:使用一种自动化测试工具来验证各种软件测试的需求,它包括测试活动的管理与实施、测试脚本的开发与执行。 自动化测试只是测试工作的一部分,是对手工测试的一种补充; 自动化测试绝不能代替手工测试;多数情况下&…...
Redis配置文件
Redis可以在没有配置文件的情况下使用内置的默认配置启动,但是这种设置仅推荐用于测试和开发。 配置Redis的正确方法是提供一个Redis配置文件,通常称为 redis.conf 。 通过命令行传递参数启动 你也可以直接使用命令行传递Redis配置参数。这对于测试非…...
[量化投资-学习笔记009]Python+TDengine从零开始搭建量化分析平台-KDJ
技术分析有点像烹饪,收盘价、最值、成交量等是食材;均值,移动平均,方差等是烹饪方法。随意组合一下就是一个技术指标。 KDJ又称随机指标(随机这个名字起的很好)。KDJ的计算依据是最高价、最低价和收盘价。…...
Activiti6工作流引擎:Form表单
表单约等于流程变量。StartEvent 有一个Form属性,用于关联流程中涉及到的业务数据。 一:内置表单 每个节点都可以有不同的表单属性。 1.1 获取开始节点对应的表单 Autowired private FormService formService;Test void delopyProcess() {ProcessEngi…...
Vitis 2020.1 里 MicroBlaze 程序编译失败?别急着找处理器,先看看你的 BRAM 够不够用
Vitis 2020.1中MicroBlaze程序编译失败的深度排查指南 当你满怀期待地点击Vitis中的"Run"按钮,却突然弹出一条"找不到microblaze_0"的警告时,千万别急着怀疑人生。这种看似处理器配置错误的表象下,往往隐藏着一个更本质的…...
Koikatu HF Patch终极指南:如何快速优化你的Koikatsu游戏体验
Koikatu HF Patch终极指南:如何快速优化你的Koikatsu游戏体验 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch Koikatu HF Patch是一款…...
Android Studio中文界面终极指南:3分钟快速实现完整汉化
Android Studio中文界面终极指南:3分钟快速实现完整汉化 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 你是否曾经在…...
5分钟上手League Akari:英雄联盟玩家的终极智能助手指南
5分钟上手League Akari:英雄联盟玩家的终极智能助手指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为繁琐的游戏操作而烦…...
NPK文件深度解析:高效提取网易游戏资源的专业工具指南
NPK文件深度解析:高效提取网易游戏资源的专业工具指南 【免费下载链接】unnpk 解包网易游戏NeoX引擎NPK文件,如阴阳师、魔法禁书目录。 项目地址: https://gitcode.com/gh_mirrors/un/unnpk 在游戏开发领域,资源文件的打包与加密是保护…...
开源智能助手深度解析:基于LCU API的英雄联盟工具集实战指南
开源智能助手深度解析:基于LCU API的英雄联盟工具集实战指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟的游戏生态…...
别再复制链接了!手把手教你用微信公众号JS-SDK生成真正的微信导航二维码(附ASP鉴权源码)
微信导航二维码开发实战:从零实现原生位置唤起功能 每次在宣传单上看到商家地址,总忍不住想扫码直接导航过去——但现实往往是扫码后跳转到浏览器,再手动复制地址到地图App。这种割裂的体验其实可以通过微信JS-SDK彻底解决。本文将带你用ASP…...
别再踩坑了!微信小程序this.setData修改对象属性的两种正确姿势(附数组场景)
微信小程序this.setData操作对象属性的深度避坑指南 刚接触微信小程序开发时,我曾在this.setData修改对象属性上栽过不少跟头。记得有一次深夜调试,明明逻辑看起来没问题,页面却始终不更新,最后发现是对象属性修改方式不当导致的。…...
佳能TS6320、TS8320、MG3680、G3800 G3810 G6080 TS3380、G3000、ts3440、ip6700错误代码5b00,p07,e08,1700解决方法,用软件清零即可
下载:点这里下载 备用下载:https://pan.baidu.com/s/1WrPFvdV8sq-qI3_NgO2EvA?pwd0000 常见型号如下: G系列 G1000、G1100、G1200、G1400、G1500、G1800、G1900、G1010、G1110、G1120、G1410、G1420、G1411、G1510、G1520、G1810、G1820、…...
5分钟掌握大麦抢票自动化:Python脚本终极使用指南
5分钟掌握大麦抢票自动化:Python脚本终极使用指南 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为抢不到心仪的演唱会门票而烦恼吗?大麦抢票脚本DamaiHelper是你的救…...
