美文网首页Android开发知识集
ViewDragHolder的简单拖动实现

ViewDragHolder的简单拖动实现

作者: sys1211 | 来源:发表于2017-03-28 10:02 被阅读5次

    在自定义ViewGroup的过程中,如果涉及到View的拖动滑动,ViewDragHelper的使用应该是少不了的,它提供了一系列用于用户拖动子View的辅助方法和相关的状态记录,像Navigation Drawer的边缘滑动、QQ5.x的侧滑菜单、知乎里的页面滑动返回都可以由它实现,所以有必要完全掌握它的使用。

    要想完全掌握ViewDragHelper的使用和原理,最好的办法就是读懂它的源码,所以就有了这篇分析,以便在印象模糊之时可以再次快速回顾ViewDragHelper的原理、用法、注意事项等。

    基本用法

    1.在自定义ViewGroup的构造方法里调用ViewDragHelper的静态工厂方法create()创建ViewDragHelper实例

    2.实现ViewDragHelper.Callback

    最重要的几个方法是tryCaptureView()、clampViewPositionVertical()、clampViewPositionHorizontal()、getViewHorizontalDragRange()、getViewVerticalDragRange()

    tryCaptureView()里会传递当前触摸区域下的子View实例作为参数,如果需要对当前触摸的子View进行拖拽移动就返回true,否则返回false。

    clampViewPositionVertical()决定了要拖拽的子View在垂直方向上应该移动到的位置,该方法会传递三个参数:要拖拽的子View实例、期望的移动后位置子View的top值、移动的距离。返回值为子View在最终位置时的top值,一般直接返回第二个参数即可。

    clampViewPositionHorizontal()与clampViewPositionVertical()同理,只不过是发生在水平方向上,最终返回的是View的left值。

    getViewVerticalDragRange()要返回一个大于0的数,才会在在垂直方向上对触摸到的View进行拖动。

    getViewHorizontalDragRange()与getViewVerticalDragRange()同理,只不过是发生在水平方向上。

    3.在onInterceptTouchEvent()方法里调用并返回ViewDragHelper的shouldInterceptTouchEvent()方法

    4.在onTouchEvent()方法里调用ViewDragHelper()的processTouchEvent()方法。ACTION_DOWN事件发生时,如果当前触摸点下要拖动的子View没有消费事件,此时应该在onTouchEvent()返回true,否则将收不到后续事件,不会产生拖动。

    相关文章

      网友评论

        本文标题:ViewDragHolder的简单拖动实现

        本文链接:https://www.haomeiwen.com/subject/lltjottx.html