1、ViewDragHelperhtml
一、是对子View进行拖拽操做,利用Scroller计算的记过,经过View.offsetLeftAndRight() 或者View.offsetTopAndBottom()方法改变childView的位置。 二、GroupView自己并不滚动,没有使用scrollTo或者scrollBy方法滚动GroupView自己 三、Scroller用的也是兼容包里面的,根据版本的不一样使用Scroller或者OverScroller。
2、OverScroller 参考ScrollViewandroid
一、基本功能是Scroller差很少, 可是能够滚动超出View自己内容的范围 二、部分系统组件已经支持OverScrollMode,须要设置View.setOverScrollMode(OVER_SCROLL_ALWAYS) 而且重载overScrollBy才能生效,参考 [Android的ListView ScrollView支持回弹效果](http://www.race604.com/android-listview-scrollview-bouncing) 三、在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回弹。 四、在onTouchEvent.up根据当前速度是否继续滚动仍是调用Scroller.springBack回弹, 在onToucheEvent.cancel中也调用Scroller.springBack回弹。我的感受Scroller.springBack没什么用, 这里调用Sroller.startScroll或者Sroller.fling也能够达到相同的效果。 五、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。