Scroller和OverScroller

原文链接: https://my.oschina.net/bruces/blog/693582

为什么80%的码农都做不了架构师?>>>   hot3.png

一、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。

转载于:https://my.oschina.net/bruces/blog/693582

你可能感兴趣的:(Scroller和OverScroller)