OnDragListener
通过 startDrag() 来启动拖拽
1 | startDrag(ClipData data, DragShadowBuilder shadowBuilder, Object myLocalState, int flags) |
第三个参数 myLocalState 可以传入任何数据,并且该数据在任何时候都可以通过 DragEvent.getLocalState() 拿到;而第一个参数 data 在放下 View 的时候才能拿到,即在 DragEvent.ACTION_DROP 发生时才能拿的到,但是这个数据是跨进程的,需要用 ClipData 来包装。第二个参数 shadowBuilder 表示如何创建拖拽起来的图像,默认是半透明的原图,可以定制。
⽤ setOnDragListener() 来监听
- OnDragListener 内部只有⼀个⽅法:onDrag()
- onDragEvent() ⽅法也会收到拖拽回调(界⾯中的每个 View 都会收到,包括 ActionBar ,无论是否设置了 OnDragListener 监听器)
代码详见 DragListenerGridView
ViewDragHelper
- 需要创建⼀个 ViewDragHelper 和 Callback()
- 需要写在 ViewGroup ⾥⾯,重写 onIntercept() 和 onTouchevent()
ViewDragHelper 详细请参考:ViewDragHelper 详解
区别
OnDragListener
- API 11 加⼊的⼯具类,⽤于拖拽操作。
- 使⽤场景:⽤户的拖起 -> 放下操作,重在内容的移动。可以附加拖拽数据
- 不需要写自定义 View,使⽤ startDrag() / startDragAndDrop() ⼿动开启拖拽
- 拖拽的原理是创造出⼀个图像在屏幕的最上层,⽤户的⼿指拖着图像移动
代码详见 DragToCollectLayout
ViewDragHelper
- 2015 年的 support v4 包中新增的⼯具类,⽤于拖拽操作。
- 使⽤场景:⽤户拖动 ViewGroup 中的某个⼦ View
- 需要应⽤在⾃定义 ViewGroup 中调⽤ ViewDragHelper.shouldInterceptTouchEvent() 和 processTouchEvent(),程序会自动开启拖拽
- 拖拽的原理是实时修改被拖拽的⼦ View 的 mLeft, mTop, mRight, mBottom 值
参考资料:
腾讯课堂 HenCoder