怎么实现直播间多个ImageView拖拽互换图片
发表于:2025-11-12 作者:千家信息网编辑
千家信息网最后更新 2025年11月12日,这篇文章主要讲解了"怎么实现直播间多个ImageView拖拽互换图片",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么实现直播间多个ImageView
千家信息网最后更新 2025年11月12日怎么实现直播间多个ImageView拖拽互换图片
这篇文章主要讲解了"怎么实现直播间多个ImageView拖拽互换图片",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么实现直播间多个ImageView拖拽互换图片"吧!
首先是XML文件代码:
重点注意,两个ImageView要分别用Layout单独装起来,后面会说原因
接下来是初始化:
mImg0 = findViewById(R.id.release_img0); mImg1 = findViewById(R.id.release_img1);mImg0_layout = findViewById(R.id.release_img0_layout);mImg1_layout = findViewById(R.id.release_img1_layout);//添加ImageView的触摸监听和各自父布局的拖拽监听 mImg0.setOnTouchListener(ImgUtils.MyTouchEvent); mImg0_layout.setOnDragListener(ImgUtils.MyDragListener); mImg1.setOnTouchListener(ImgUtils.MyTouchEvent); mImg1_layout.setOnDragListener(ImgUtils.MyDragListener);
监听详情:
public class ImgUtils { private static long lastTime; public static View.OnTouchListener MyTouchEvent = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { LogUtils.loge("ACTION_DOWN"); long lastTime1 = System.currentTimeMillis(); lastTime=lastTime1; ClipData data = ClipData.newPlainText("", ""); View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); v.startDrag(data, shadowBuilder, v, 0); if ((lastTime1-lastTime)<200){ v.setAlpha((float) 1.0); return false; } v.setAlpha((float) 0.5); } else if (event.getAction() == MotionEvent.ACTION_UP){ LogUtils.loge("ACTION_UP"); long time = System.currentTimeMillis(); if ((time - lastTime)<500){ // 间隔小于500毫秒,视为点击事件 return false; } }else if (event.getAction() == MotionEvent.ACTION_MOVE){ LogUtils.loge("ACTION_MOVE"); } return false; } }; public static View.OnDragListener MyDragListener = new View.OnDragListener() { @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) @Override public boolean onDrag(View v, DragEvent event) { View visitorView = (View) event.getLocalState(); if (visitorView == null) return true; ViewGroup visitorOwner = (ViewGroup) visitorView.getParent(); ViewGroup visitedOwner = (ViewGroup) v; View visitedImage = visitedOwner.getChildAt(0); switch (event.getAction()) { case DragEvent.ACTION_DRAG_ENTERED: v.setAlpha((float)0.7); break; case DragEvent.ACTION_DROP: visitedImage.setAlpha((float)1.0); if (visitorOwner != visitedOwner) { visitedOwner.removeView(visitedImage); visitorOwner.removeView(visitorView); visitorOwner.addView(visitedImage); LinearLayout container = (LinearLayout) v; container.addView(visitorView); }else { visitedImage.performClick(); // 如果归复原位 响应点击事件 } break; case DragEvent.ACTION_DRAG_ENDED: v.setAlpha((float)1.0); visitedImage.setAlpha((float)1.0); break; case DragEvent.ACTION_DRAG_EXITED: v.setAlpha((float)1.0); break; } return true; } }; }在这里,我将监听提出来写成了公共的静态方法,
一方面是为了复用,
另一方面是为了多个ImageView互相拖拽时候的多指拖动冲突.核心思想:判断子控件触摸监听的调用间隔.
另外,我这边处理了点击事件和滑动事件的冲突,核心思想:在父布局的拖拽监听里判断子控件拖出去是否放回了原处,如放回了原处,则调用子控件的模拟点击,
点击与滑动冲突的原因:
1.当滑动监听返回true的时候,消费了点击事件,导致点击事件无法触发(源码角度)
2.当OnTouchListener 中的按下事件开始执行拖动时,OnTouchListener 无法收到UP事件(受拖拽影响),
3.即使OnTouchListener 监听中写了返回false,仍然会因为开启了拖拽而被提前返true.
点击与滑动冲突的解决思想:
1.在父布局的拖拽监听中, 判断他的起点和终点是否在同一个layout中
2.如满足第一点条件,则获取layout的第一个孩子,执行孩子的点击事件(模拟点击performClick());
感谢各位的阅读,以上就是"怎么实现直播间多个ImageView拖拽互换图片"的内容了,经过本文的学习后,相信大家对怎么实现直播间多个ImageView拖拽互换图片这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
事件
监听
多个
图片
直播间
直播
冲突
布局
思想
控件
学习
内容
原因
孩子
时候
核心
接下来
一方
两个
代码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
ssh 其他服务器
建筑公司软件开发工作平台
电子商务中遇到的网络安全
寒武纪软件开发总共几轮面试
国家人口普查数据库
软件开发上架流程
校园网络安全解决方案设计
我国网络安全的基本概况论文
群晖数据库当前无法访问
windows服务器模式
绝地求生未来之役怎样修改服务器
vb 数据库 数组
app软件开发公司北京
数据库 cator
武汉国家网络安全基地
机架式服务器维修站点
我的世界服务器发光指令
网信办普法网络安全法
苏州优行网络技术
网络安全管理和运维
简述系统数据库及空间数据库特点
数据库四种表结构
专科软件开发毕业论文
西继迅达服务器状态显示
网络技术服务承包承揽
网络安全启明星晨股价
军用综合网络安全防护管理平台
招标文件软件开发售后
逆战哪个服务器人少
服务器怎么查看支持的协议版本