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

View对象既可以用实现View.OnDragListener接口的拖放事件监听器,也可以用View对象的onDragEvent(DragEvent)回调方法来接收拖拽事件。当系统调用这个回调方法或监听器时,都要给它们传递一个DragEvent对象。

在大多数场景中你可能会使用监听器。因为在设计UI界面时,通常没有View类的子类,而使用回调方法,为了覆写这个方法,就会强制你使用View类及子类。相比之下,你可以实现一个监听器类,然后再几个不同的View对象中使用。你还可以把监听器接口作为一个匿名的内部类来实现。调用setOnDragListener()方法给View对象设置监听器。

View对象能够同时拥有监听器和回调方法,如果发生这种情况,系统会首先调用监听器。除非监听器返回了false,否则系统不会调用回调方法。

onDragEvent(DragEvent)回调方法和View.OnDragListener监听器的组合跟用于触屏事件的onTouchEvent()回调方法和View.OnTouchListener监听器类似。

拖拽事件

系统用DragEvent对象形式的拖拽事件。这个对象包含了一个操作类型,它告诉监听器在拖放过程中发生的事情。这个对象还根据操作类型,包含了其他的数据。

调用getAction()方法能够获得操作类型。有六种可能的值,在DragEvent类中被定义成常量。详细见下表1.

DragEvent对象还包含了应用程序在调用startDrag()方法时,提供给系统的数据。这些数据中有些只对特定的操作类型有效。在下表2中概要的介绍了对每种操作类型可以获取的有效数据。

表1.DragEvent操作类型

getAction()方法返回值

含义

ACTION_DRAG_STARTED

只在应用程序调用startDrag()方法,并且获得了拖拽影子后,View对象的拖拽事件监听器才接收这种事件操作。

ACTION_DRAG_ENTERED

当拖拽影子刚进入View对象的边框时,View对象的拖拽事件监听器会接收这种事件操作类型。

ACTION_DRAG_LOCATION

在View对象收到一个ACTION_DRAG_ENTERED事件之后,并且拖拽影子依然还在这个对象的边框之内时,这个View对象的拖拽事件监听器会接收这种事件操作类型

ACTION_DRAG_EXITED

View对象收到一个ACTION_DRAG_ENTERED和至少一个ACTION_DRAG_LOCATION事件之后,这个对象的事件监听器会接受这种操作类型。

ACTION_DROP

当用户在一个View对象之上释放了拖拽影子,这个对象的拖拽事件监听器就会收到这种操作类型。如果这个监听器在响应ACTION_DRAG_STARTED拖拽事件中返回了true,那么这种操作类型只会发送给一个View对象。如果用户在没有被注册监听器的View对象上释放了拖拽影子,或者用户没有在当前布局的任何部分释放操作影子,这个操作类型就不会被发送。如果View对象成功的处理放下事件,监听器要返回true,否则应该返回false。

ACTION_DRAG_ENDED

当系统结束拖拽操作时,View对象拖拽监听器会接收这种事件操作类型。这种操作类型之前不一定是ACTION_DROP事件。如果系统发送了一个ACTION_DROP事件,那么接收ACTION_DRAG_ENDED操作类型不意味着放下操作成功了。监听器必须调用getResult()方法来获得响应ACTION_DROP事件中的返回值。如果ACTION_DROP事件没有被发送,那么getResult()会返回false。

表2.通过操作类型事件获取有效的DragEvent对象的数据,x代表能够获取有效数据。

getAction() Value

getClipDescription()

getLocalState()

getX()

getY()

getClipData()

getResult()

ACTION_DRAG_STARTED

X

X

X

X

ACTION_DRAG_ENTERED

X

X

ACTION_DRAG_LOCATION

X

X

X

X

ACTION_DRAG_EXITED

X

X

ACTION_DROP

X

X

X

X

X

ACTION_DRAG_ENDED

X

X

X

getAction()、describeContents()、writeToParcel()和toString方法始终返回有效的数据。

对于特殊的操作类型,如果一个方法不包含有效的数据,就会根据类型的不同而返回null或0。

拖拽影子

在拖拽和放下操作期间,系统会显示一张用户拖动的图片。对于要移动的数据,这张图片就代表了被拖动的数据。对于操作,这张图片就代表了拖动操作的某些外观。

这张图片被叫做拖动影子,使用View.DragShadowBuilder对象的方法来创建它,并且在使用startDrag()方法开始拖拽时,把这个对象传递给系统。作为响应startDrag()方法的一部分,系统会调用在View.DragShadowBuilder对象中定义的回调方法,来获取拖拽影子。

View.DragShadowBuilder类有两个构造器:

View.DragShadowBuilder(View):

这个构造器接收任意的应用程序的View对象。这个构造器把View对象保存在View.DragShadowBuilder对象中,以便在回调期间访问这个View对象,来构造拖拽影子。它(View对象参数)不必跟用户选择的开始拖拽操作的View对象相关联。

如果使用这个构造器,就不必扩展View.DragShadowBuilder类或覆写它的方法。默认情况,你会获得一个跟传递给构造器的View对象外观相同的拖拽影子。在用户的触屏位置下方,以出点为中心显示。

View.DragShadowBuilder():

如果使用这个构造器,在ViewDragShadowBuilder对象中没有有效的View对象。默认情况下,如果使用这个构造器,并且没有扩展View.DragShadowBuilder类或覆写它的方法,那么就会获得一个不可见的拖拽影子,系统不会给出错误。

ViewDragShadowBuilder类有两个方法:

onProvideShadowMetrics():

在你调用startDrag()方法后,系统会立即调用这个方法,给系统发送拖拽影子的尺寸和触点。这个方法有两个参数:

dimensions:一个Point对象,其中X代表影子的宽度,Y代表影子的高度;

touch_point:一个Point对象,这个触点应该是拖拽期间用户手指下方的拖拽影子的位置,X代表x轴的坐标,Y代表y轴的坐标。

onDrawShadow():

调用onProviderShadowMetrics()回调之后,系统会立即调用onDrawShadow()方法来获得拖拽影子。这个方法有一个画布参数(Canvas对象),系统会使用onProvideShadowMetrics()方法中提供的参数来构造这个Canvas对象,并在这个对象中描画拖拽影子。

要改善性能,就要保持拖拽影子要用小的尺寸。对于一个单独的项目,可以使用一个图标,对于多项选择,可以是堆栈中的图标而不是分散在屏幕上的完整的图片。

  • 上一篇Android 用户界面---拖放(Drag and Drop)(一)
  • 下一篇Android 用户界面---拖放(Drag and Drop)(三)

转载于:https://www.cnblogs.com/xgjblog/p/3966836.html

Android 用户界面---拖放(Drag and Drop)(二)相关推荐

  1. html5css3菜鸟教程,HTML5+CSS3实现拖放(Drag and Drop)示例

    本文简单介绍一下HTML5的拖放实现.MXGHTML5中文学习网 - HTML5先行者学习网 拖放(Drag 和 drop)是 HTML5 标准的组成部分.MXGHTML5中文学习网 - HTML5先 ...

  2. [Ext JS 4] 拖放[drag and drop]

    定义拖放 一个拖动操作,就是在某个页面元素上按下鼠标并移动.一个放下操作,就是在拖动动作之后放开鼠标.可以从下图来看: Ext JS 的Ext.dd 类中定义了基本的拖放操作. 拖放类的组织 所有的拖 ...

  3. html拖放数据库字段,利用HTML5拖放(Drag 和 Drop)实现Table间数据的交互

    前言 作为开发者,我们总是会不经意间的遇到一些令人头疼的需求.比如五彩斑斓的黑,根据手机壳变换APP的颜色等等,你说怎么办.虽然在一般情况下不会这么棘手,但是有些需求刚拿到的时候还是会一筹莫展. 表格 ...

  4. H5 拖放drag跟drop

    H5的拖放功能主要是通过drag和drop来实现的,目前IE9.Firefox.Opera 12.Chrome 以及 Safari 5 是支持拖放的,Safari 5.1.2 中不支持拖放.下面先放一 ...

  5. 拖放(Drag和Drop)--html5

    拖放,就是抓取一个对象后拖放到另一个位置.很常用的一个功能,在还没有html5的时候,我们实现这个功能,通常会用大量的js代码,再利用mousemove,mouseup等鼠标事件来实现,总的来说比较麻 ...

  6. Qt拖放 drag and drop

    拖放提供一个应用程序之间传递信息的一种简单的可视化机制.拖放机制类似于剪切和粘贴机制.拖放操作同时被QT项目视图和图形视图框架支持. QApplication提供了两个拖放相关的方法: 1. QApp ...

  7. HTML5 拖放Drag和drop用法以及事件介绍

    dragstart:拖拽开始时在被拖拽元素上触发此事件 drag:拖拽过程中被拖拽的元素会持续不断地发drag事件. dragend:鼠标在拖放目标上释放时,在拖搜元素上触发,将元素从浏览器拖放到操作 ...

  8. html拖放数据库字段,HTML5 拖放(Drag 和 Drop)

    拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. #div1 {width:350px;height:70px;padding:10p ...

  9. Drag and drop拖放框架

    Drag and drop拖放框架 android11-release 应用使用 拖放 Drag and drop Drag and drop拖放启动 APP调用启动 拖放 Drag and drop ...

最新文章

  1. Browser Security-超文本标记语言(HTML)
  2. Windows 7下,中兴U880通过电脑无线网卡共享上网(共享无线上网)
  3. python安卓打包_Android多渠道打包之Python打包
  4. 阅读APP,为什么都开始抢kindle生意了?
  5. PHP实现四种排序-插入排序
  6. Kotlin学习笔记30 补充 作用域函数
  7. 自学python能干什么-python能干啥
  8. 小米手机下载二维码APP
  9. 【干货分享】用AI工具设计一款吸引人的字体效果
  10. 计算机里的硬盘分区,Disk Genius对电脑硬盘分区的详细步骤
  11. win7家庭普通版升级旗舰版 密钥
  12. 哪些技术会决定前端开发者的未来发展?
  13. JPEG系列一 JPEG图片的文件格式
  14. 华为无线设备WLAN QoS配置命令
  15. Python编程求解指数增长问题
  16. 51单片机串口通信模板_51单片机串口通信
  17. java:swagger-codegen生成CSharp(C#) Client
  18. 由于找不到服务器或出现DNS错误
  19. 从生到死, 人皆为货币
  20. (Python)公式计算Π

热门文章

  1. python gil锁_python GIL锁
  2. fmea软件_新版FMEA易错点梳理(一):范围界定和过程流程图-SGS
  3. python计算2的平方代码_计算平方根
  4. mybatisplus查询今天的数据_springboot集成mybatisPlus
  5. 【hadoop】java 获取 yarn app 信息 报错 ConfiguredRMFailoverProxyProvider - Failing over to rm2
  6. 【java】Thread.start 它是怎么让线程启动的呢
  7. 【clickhouse】flink clickhouse sink Class.forName 卡死
  8. 【java】JMH微基准测试,报错Unable to find the resource: /META-INF/BenchmarkList
  9. 【elasticsearch】 document 查询原理
  10. 【面试题】面试问红黑树,我脸都绿了。。