Android⽤户界⾯---拖放(DragandDrop)(⼀)
⽤Android的拖放框架,能够允许⽤户使⽤图形化的拖放⼿势,把数据从当前布局中的⼀个View对象中移到另⼀个View对象中。这个框架包括:拖拽事件类、拖拽、以及辅助的⽅法和类。
尽管这个框架主要是为数据移动设计的,但是你能够把它⽤于其他的UI操作。如,你能够创建⼀个调⾊应⽤程序,⽤户把⼀个颜⾊的图标拖到另⼀个颜⾊图标之上,完成两个颜⾊的调配操作。
概要
当⽤户使⽤⼀些被认可的⼿势信号来开始拖动数据时,⼀个拖放操作就开始了。在响应中,应⽤程序会告诉系统拖动正在启动。系统就会回调应⽤程序来获得⼀个代表被拖动的数据的图形,当⽤户的⼿指移到这个代表图形(拖动阴影)当前的布局之上时,系统会把拖动事件发给拖动事件对象,并且拖动事件回调⽅法会跟布局中对应View对象进⾏关联。⼀旦⽤户释放了拖动阴影图形,系统就会结束拖动操作。
从实现View.OnDragListener接⼝的类中创建⼀个拖动事件对象。⽤View对象的setOnDragListener()⽅法把拖动事件对象设置给⼀个View对象。每个View对象还有⼀个onDragEvent()回调⽅法。这两个⽅法会在“拖拽事件和回调⽅法”⼀节中详细介绍。
注意:为了简单起见,⼀下章节⽤“拖拽事件”作为接收拖拽事件的⽰例程序,尽管可实践中也可以
使⽤回调⽅法。
在开始拖动的时候,要把要移动的数据和描述这个数据的元数据作为系统调⽤的⼀部分。拖拽期间,系统把拖拽事件发送给拖拽事件或布局中每个View对象的回调⽅法。或回调⽅法能够使⽤元数据来判断它们是否能够接受这种数据。如果⽤户在⼀个View对象之上放下数据,并且这个View对象的或回调⽅法已经告诉系统它要接收这个数据,那么系统就会把数据发送给拖拽事件中的或回调⽅法。
通过调⽤startDrag()⽅法,应⽤程序会告诉系统开始拖拽的动作。这样就告诉系统要开始发送拖拽事件了。这个⽅法也发送正在拖放的数据。
你能够针对当前布局中任何绑定的View对象调⽤startDrag()⽅法。系统只使⽤View对象来获取对布局中的全局设置的访问。
⼀旦你的应⽤程序调⽤了startDrag()⽅法,剩下的过程就是使⽤系统发送给布局中的View对象的事件。
拖放过程
在拖放过程中有以下四个基本的步骤或状态:
1.  开始
view ui框架
在响应⽤户的屏幕⼿势中来开始拖拽,应⽤程序要调⽤startDrag()⽅法来告诉系统开始拖拽。给startDrag()⽅法提供的参数包括:被拖拽的数据、这个数据的元数据、以及描画拖拽阴影的回调⽅法。
系统通过响应这个调⽤,⾸先返回应⽤程序需要的拖拽阴影。然后再设备上显⽰阴影。
接下来,系统会把带有ACTION_DRAG_STARTED类型的拖拽事件发送给当前布局中所有的View对象的拖拽事件,如果要继续接收拖拽事件包括可能的放下事件,View对象的拖拽事件必须返回true。这样就在系统中注册了。只有被注册的能够继续接收拖拽事件。这时,也能够改变它的View对象的外观来表⽰这个对象的能够接收放下事件。
如果拖拽事件返回false,那么⼀直到系统发送带有ACTION_DRAG_ENDED类型操作的拖拽事件时,这个事件都不会接收当前操作的拖拽事件。通过发送false返回值,会告诉系统它对这个拖拽操作不感兴趣,并且不会接收被拖拽的数据。
2.  持续
⽤户持续拖拽过程中,当拖拽阴影跟⼀个View对象的边框相交时,系统就会发送⼀个或多个拖拽事件给View对象的拖拽事件(如果它被注册⽤来接收这些事件的话)。也可以选择改变响应事件的View对象的外观。例如,如果这个事件指⽰拖拽阴影已经进⼊到接受拖拽事件的View对象的边框内,就能够通过⾼亮显⽰它的View对象来做出反应。
3.  放下
⽤户在能够接受数据的View对象的边框内释放拖拽阴影,系统就会给View对象的发送⼀个带有ACTION_DROP操作类型的拖拽事件。这个拖拽事件包含在startDrag()⽅法调⽤中传递给系统的数据。如果接受成功,就会返回true给系统。
注意,这个步骤只会在⽤户放下拖放阴影的View对象(这个对象被注册⽤于接受这个拖拽事件)中发⽣,如果⽤户在其他的任何不接收这个拖拽事件的地⽅释放了拖拽阴影,就不会有ACTION_DROP拖拽事件发出。
4.  结束
⽤户释放了拖拽阴影之后,并且如果需要,系统也会发出了带有ACTION_DROP操作类型的拖拽事件,系统就会发出带
有ACTION_DRAG_ENDED操作类型的拖拽事件,指⽰拖拽操作结束了。⽤户释放拖拽阴影的时机就是解除注册的时机。这个事件会发送给每个被注册⽤于接受这个拖拽事件的,即使这个收到了ACTION_DROP事件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。