Android DragAndDrop API 拖拽效果 交换ListView的Item值

前言

Android系统自API Level11开始添加了关于控件拖拽的相关API,可以方便的实现控件的一些拖拽效果,而且比自己用Touch事件写的效果更好。下面就来看下DragAndDrop吧。

使用Android的DragAndDrop框架,我们可以方便的在当前布局中用拖拽的形式实现两个View之间数据的互换。DragAndDrop框架包括一个拖拽事件的类,拖拽监听器,以及一些帮助方法和类。

尽管DragAndDrop主要是为了数据移动而设计,但是我们也可用他做别的UI处理。举个例子,我们可以用它来做一个APP,功能是当拖拽一个色调的图标a经过另一个色调的图标b时,将这两种色调混合。

概述

一个拖拽操作开始于当用户在手机屏幕上做出一些被我们定义为开始拖拽数据的手势。作为这些手势的回应,我们的app告诉Android系统说拖拽开始啦。Android系统会回调我们的app方法来获取被拖拽的展现数据。当用户的手指移动着这些展现(实际是被拖拽的控件影子)经过当前布局,系统就会发出拖拽事件给拖拽事件监听器对象和拖拽事件的回调方法将布局中的视图View关联起来。一旦用户手指松开,系统会终止拖拽操作。
我们创造一个实现了View.OnDragListener接口的类的拖拽事件监听器对象(Listener),通过View.setOnDragListener给一个View对象设置拖拽监听器,可将这个对象当做参数传递进去。每个VIew对象也有一个onDragEvent()的回调方法。当开始一个拖拽操作的时候,会将移动中的数据和描述这些数据的原始数据传递给系统。拖拽过程中,系统会给布局中的每个View的拖拽事件监听器或者回调方法发出拖拽事件,监听器或者回调方法可以根据原始数据来决定当手指松开的时候他们是否接收这些数据。如果用户将数据放到另一个View之上,并且这个View的监听器或者回调方法事先已经告诉系统他会接收来自拖拽的数据,那么系统就会将数据放在拖拽事件里发给这个View的监听器或者回调方法。
app一旦调用startDrag()方法就告诉了系统开始一个拖拽操作,发送拖拽数据和拖拽事件event。布局里的任何View都可以调用startDrag()方法,系统只会用布局里的View对象去访问全局设置。一旦调用startDrag()方法,剩下的就是处理系统发给View对象的拖拽事件event了。

Drag/Drop的处理

Drag/Drop的流程基本有以下四步:
1. Started
为了响应用户开始拖拽的手势,app调用startDrag()方法告诉系统开始一个拖拽流程。startDrag()的参数包含了被拖拽对象的数据,以及这些数据的元数据,和绘制拖拽影子的回调方法。
系统首先会响应回调获取一个拖拽影子,然后展示在设备上。
下一步,系统会发送一个ACTION_DRAG_STARTED类型的拖拽事件给当前布局的所有View的拖拽监听器。为了能继续接收拖拽事件,以及可能的松开事件,拖拽事件监听器必须返回一个true。这个在系统注册监听器,只有注册监听器才能继续接收拖拽事件,在这点上,监听器可以改变它们的View对象的外观表明监听器也可以接收一个手指松开的事件。
如果手指监听器返回一个false,他就不会再接收到当前拖拽操作的拖拽事件直到系统发送一个ACTION_DRAG_ENDED类型的拖拽事件。发送false就表示监听器告诉系统,他对本次的拖拽操作已经不感兴趣,也不愿接收拖拽数据。
2. Continuing
用户继续拖拽,当拖拽的影子到达一个View视图内部的时候,系统会发出一个或者多个拖拽事件到这个View的拖拽事件监听器(如果这个View注册了监听器),监听器可以选择改变这个View的外观来响应这些事件。举个例子,如果拖拽事件表明拖拽影子已经进入了View的盒子模型内,这个时候的事件类型是ACTION_DRAG_ENTERED,这个View可以高亮自己。
3. Dropped
当用户手指在一个View的范围内松开拖拽影子的时候可以接受拖拽数据,这时这个View的监听器会收到类型为ACTION_DROP的事件。拖拽事件包括开始拖拽操作startDrag()的时候传递给系统的拖拽数据。如果代码成功接收了drop事件,监听器返回true。
要说明的是,这个过程只会发生在控件已经注册拖拽事件监听器接收拖拽事件并且手指在这个控件的范围内松开的情况下。如果用户在其他任何一种情况下释放拖拽,都不会有ACTION_DROP类型的事件发出。
4. ENDED
在用户松开拖拽影子后,在系统发送ACTION_DROP类型的拖拽事件(如果有必要)后,系统会发出一个ACTION_DRAG_ENDED类型的拖拽事件表明此次拖拽操作结束。不管用户在哪里释放这都表明本次拖拽操作结束。只要注册了监听器接收拖拽事件都会收到这个事件,即使已经接受了ACTION_DROP事件。

拖拽事件监听器和回调方法

一个View要么通过注册一个实现了View.OnDragListner接口的监听器,要么通过他的回调方法onDragEvent(DragEvent)来接收拖拽事件,当系统调用回调方法或者监听器的方法的时候,系统会传递给他们一个DragEvent类型的对象。
我们大多数情况下都会使用监听器而不是直接用回调方法,当我们设计UI的时候,我们不会经常继承View类,但是使用回调方法的办法将会为了覆盖这个方法而强制我们这么做。相比较来说,我们可以实现一个监听器类然后把它应用到不同的View对象中。也可以将他写成一个匿名内部类,然后用setOnDragListener方法将他赋给View对象。
当然一个View对象可以同时具有监听器和回调方法,这种情况下,系统将会首先调用监听器,如果监听器返回false,系统才会接下来调用回调方法。
onDragEvent(Dragevent)方法和View.OnDragListner的结合与onTouchEvent()和View.OnTouchListener关于触摸事件的结合相似。

Drag events

系统以DragEvent对象的形式发送拖拽事件。这个对象包含事件动作类型,告诉监听器拖拽过程中发生了什么。这个对象中还包含
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值