一、ViewDragHelper
1、是对子View进行拖拽操作,利用Scroller计算的记过,通过View.offsetLeftAndRight()
或者View.offsetTopAndBottom()方法改变childView的位置。
2、GroupView本身并不滚动,没有使用scrollTo或者scrollBy方法滚动GroupView本身
3、Scroller用的也是兼容包里面的,根据版本的不同使用Scroller或者OverScroller。
二、OverScroller 参考ScrollView
1、基本功能是Scroller差不多, 但是可以滚动超出View本身内容的范围
2、部分系统组件已经支持OverScrollMode,需要设置View.setOverScrollMode(OVER_SCROLL_ALWAYS)
并且重载overScrollBy才能生效,参考
[Android的ListView ScrollView支持回弹效果](http://www.race604.com/android-listview-scrollview-bouncing)
3、在onTouchEvent.move和computeScroll()中调用View.overScrollBy方法,View.overScrollBy
方法中根据是否是OVER_SCROLL_ALWAYS模式来计算maxOverScrollY,View.overScrollBy根据计算
的新的滚动位置调用View.onOverScrolled回调方法,子类需要实现该方法,如果
Scroller.isFinished()==true,说明正在拖拽,调用super.scrollTo( scrollX, scrollY )
继续滚动,否则认为是手已经release了,正在scroll或者fling过程中,也是调用super.scrollTo
( scrollX, scrollY )继续滚动 ,但是到了maxOverScrollY 时,调用Scroller.springBack回弹。
4、在onTouchEvent.up根据当前速度是否继续滚动还是调用Scroller.springBack回弹,
在onToucheEvent.cancel中也调用Scroller.springBack回弹。个人感觉Scroller.springBack没什么用,
这里调用Sroller.startScroll或者Sroller.fling也可以达到相同的效果。
5、Scroller.springBack(int startX, int startY, int minX, int maxX, int minY, int maxY)
方法,minX和minY一般是0,maxY和maxY是可滚动区域, 比如ScrollView是
Math.max(0, child.getHeight() - (getHeight() - mPaddingBottom - mPaddingTop));
[这个例子](http://www.cnblogs.com/chyl411/p/3847930.html) 因为本身不具备滚动,所以是0。