怎么实现直播间多个ImageView拖拽互换图片
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"怎么实现直播间多个ImageView拖拽互换图片",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么实现直播间多个ImageView
千家信息网最后更新 2026年11月03日怎么实现直播间多个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安全错误
数据库的锁怎样保障安全
亿人帮互联网科技有限公司
科技互联网产品
互联网核心科技是什么
致骋互联网科技
凡科互联网科技
互联网科技小额贷款
互联网 科技服务平台
佩信高科技互联网
中盈科技互联网信息有限公司
厦门千工互联网科技有限公司
千方科技属于互联网企业吗
搜狐科技互联网
互联网数据科技专业
区块链结合互联网科技
银行科技岗属于互联网吗
互联网营销推广黑科技
富国互联网金融科技混合基金
工业互联网科技创业
张家口科技产业互联网平台
互联网时代高科技布局
互联网的科技创新
互联网科技咨询
济南和联互联网科技有限公司
顶级互联网科技成果有哪些
重庆互联网医院沙龙医盟信息科技
中国航天科技大学国际工业互联网
科技类公司包括互联网吗
扫呗互联网科技有限公司
广州梦谷互联网科技有限公司领导
小牛互联网科技有限公司地址