Android 多个ImageView拖拽互换图片
马上又是新的一年了,
在写这篇博客之前,深海预祝大家新的一年里健康快乐,万事如意.
话不多说直接上代码:
首先是XML文件代码:
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"android:orientation="horizontal" ><LinearLayoutandroid:id="@+id/release_img0_layout"android:layout_width="0px"android:layout_height="match_parent"android:layout_marginLeft="20px"android:layout_weight="1"><ImageViewandroid:id="@+id/release_img0"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop" /></LinearLayout><LinearLayoutandroid:id="@+id/release_img1_layout"android:layout_width="0px"android:layout_height="match_parent"android:layout_marginLeft="20px"android:layout_weight="1"><ImageViewandroid:id="@+id/release_img1"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop" /></LinearLayout></LinearLayout>
重点注意,两个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() {@Overridepublic 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)@Overridepublic 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());
Android 多个ImageView拖拽互换图片相关推荐
- Android仿QQ消息拖拽效果(二)
前言 本文参考辉哥贝塞尔曲线 - QQ消息汽包拖拽,前面我们使用二阶贝塞尔曲线绘制了拖拽圆点效果Android仿QQ消息拖拽效果(一)(二阶贝塞尔曲线使用),这里我们在此基础之上实现仿QQ消息拖拽爆炸 ...
- android ListView和GridView拖拽移位具体实现及拓展
关于ListView拖拽移动位置,想必大家并不陌生,比较不错的软件都用到如此功能了.如:搜狐,网易,百度等,但是相比来说还是百度的用户体验较好,不偏心了,下面看几个示例: 首 ...
- android xml图片缩放,Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码...
概述:通过自定义ImageView控件,在xml布局里面调用自定的组件实现图片的缩放. /** * 自定义的ImageView控制,可对图片进行多点触控缩放和拖动 * * @author qiuwan ...
- Android qq消息气泡实现效果,Android 实现仿QQ拖拽气泡效果的示例
效果图: 一.实现思路 在列表中默认使用自定义的TextView控件来展示消息气泡,在自定义的TextView控件中重写onTouchEvent方法,然后在DOWN.MOVE.UP事件中分别处理拖拽效 ...
- JavaFX鼠标拖拽移动图片
一.鼠标拖拽移动图片 package cn.util;import java.io.File; import javafx.application.Application; import javafx ...
- 通过拖拽改变图片大小
<!doctype html> <html lang="en"><head><meta charset="utf-8" ...
- pygame鼠标进行拖拽移动图片、缩放、以及按钮响应 案例
pygame鼠标进行拖拽移动图片.缩放.以及按钮响应 案例 # -*- coding: UTF-8 -*- #!/usr/bin/env python3 # @Time : 2021.12 # @Au ...
- Win7/windows8/win 10系统下Photoshop不能直接拖拽打开图片的解决办法
我们知道Adobe Photoshop打开图片的方式有很多种,其中有一种是我们经常用到的,那就是直接从资源管理器或者其他地方中直接把图片通过拖拽的方式拖到PS窗口中打开,在Win10系统中,使用PS的 ...
- html5图片拖拽删除,基于jquery插件实现拖拽删除图片功能
本文实例为大家分享了jquery插件实现拖拽删除图片功能的具体代码,供大家参考,具体内容如下 实现以下效果 完全拖出这个层,图片会消失,否则图片会回到原来的位置 #mydiv{ width:900px ...
最新文章
- 【跃迁之路】【473天】刻意练习系列232(2018.05.24)
- AI专家Marcus质疑深度学习:面临十大挑战(含参考文献)
- sift计算描述子代码详解_SIFT解析(三)生成特征描述子
- MFC CListCtrl 取消选中
- java jxl之Excel的读取
- android获取ip命令
- html三栏布局有哪几种,CSS三栏布局的5种方法详解
- python爬虫分析百度文库、道客巴巴、豆丁网获取图片链接
- 基于组件技术的电子海图显示系统开发方法
- OLED工作原理及结构
- 华为设备配置OSPF的NSSA区域
- 图像的剪裁——imcrop
- pytorch修改图片尺寸大小
- ipad如何与计算机连接网络连接不上,苹果平板ipad的无法连接无线网络WiFi如何解决...
- 基于微信小程序的校园第二课堂活动报名系统+后台管理系统(Springboot+mysql)-JAVA.VUE【毕业设计、论文、源码、开题报告】
- 马未都说收藏:陶瓷篇(18、19)五彩瓷、斗彩
- 实时视频通话超低延迟架构的思考与实践
- 五种提前还款方式那种更划算
- OpenCV开发笔记(五十五):红胖子8分钟带你深入了解Haar、LBP特征以及级联分类器识别过程(图文并茂+浅显易懂+程序源码)
- 卷积神经网络的可视化(基于keras)