DEVLOG 9.10 关于ViewDragHelper的使用小结
Q:为什么要使用ViewDragHelper?
A: 为了简化ViewGroup中一些复杂的拖拽逻辑.

ViewDragHelper中的重要概念
ViewDragHelper.Callback
我们一般通过这个回调来控制View在被拖动时的行为。它主要包含这些回调方法:

2. 使用ViewDragHelper【接管】onInterceptTouchEvent和onTouchEvent方法。
在接管这些方法的时候,上述回调中有些方法必须重写。


因为我们通常使用ViewDragHelper的返回值作为onInterceptTouchEvent的返回值,所以我们并不清楚这个ViewGroup是否真正拦截了事件流。考虑最简单的情形,如果我们的ViewGroup中只有一个View。

ViewDragHelper对于Down事件只做了简单的处理,对于MOVE事件,ViewDragHelper会检查【滑动范围】。这个只是做一个限制性的操作。这个通过ViewHorizontalDragRange和VerticalDragRange确定。
clampViewPositionHorizontal和Vertical方法确定滑动时的位置。如果只设置水平滑动,Vertical返回0。同时可以检查当前的滑动是否到了边界,如果到了边界,通过设置一个固定值,可以避免出界。
2. 滑动边界
ViewDragHelper可以检查在边界位置的滑动

这里有很多不同的枚举,检查在不同边缘的滑动。
3. onViewReleased
通过这个回调可以实现如微信电话的icon回弹的效果。举个例子:

如果超过中点就会强制回到左边界或者右边界,通过settleCapturedViewAt。他的具体实现使用了Scroller,我们知道使用Scroller就必须要重写computeScroll,而且使用scroller.startScroll也必须使用View#invalidate。具体的原因我们可以看看:

因为ViewDragHelper最终使用了Scroller实现滑动,而Scoller本身并不能滑动,他只是一个计算器,根据时间的流逝计算应该滑动到的位置。真正的滑动逻辑是在View调用invalidate之后,View在绘制过程中会索取scrollX scrollY,然后做一个小位移。
我们需要实现computeScroll,主要是为了判定滑动是否到了尽头。
