拖拽

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

Fork me on GitHub