怎么实现直播间多个ImageView拖拽互换图片
发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,这篇文章主要讲解了"怎么实现直播间多个ImageView拖拽互换图片",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么实现直播间多个ImageView
千家信息网最后更新 2025年02月08日怎么实现直播间多个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安全错误
数据库的锁怎样保障安全
软件开发工程师平均年龄
软件开发招股
extjs与数据库交互
潮汕手机软件开发报价
何为直销软件开发
注意网络安全有哪些方面
辽宁机械软件开发销售厂家
安全接入服务器地址吉林
中国网络安全行业研究白皮书
oracle数据库配置站点
天津去哪学软件开发好
塘厦网络技术学校
南美有服务器的手游
招聘技术型人才软件开发
网络安全训练营直播课
数据库原理及应用习题答案李月军
内蒙古一对一网络技术服务原则
数据库的垂直和水平拆分
网络安全加强人才队伍建设
中山码上网络技术有限公司
创品网络技术有限公司
沈阳有数据库培训机构吗
计算机网络安全的维护总结
asp数据库编辑软件
数据库建立的技术指标
网络安全第一哨
软件开发的基本功能
苹果手机无法获取服务器地址
sql如何搜索n m数据库
山西数据中心服务器直销厂家