Android里Scroller类是为了实现View平滑滚动的一个Helper类。通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(context)。设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动。
相关API介绍如下:
1 2 3 4 5 6 7 8 9 10 11 12 mScroller.getCurrX() mScroller.getCurrY() mScroller.getFinalX() mScroller.getFinalY() mScroller.setFinalX(int newX ) mScroller.setFinalY(int newY ) mScroller.startScroll(int startX , int startY , int dx , int dy ) mScroller.startScroll(int startX , int startY , int dx , int dy , int duration ) mScroller.computeScrollOffset()
举例说明,自定义一个CustomView,使用Scroller实现滚动:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.LinearLayout; import android.widget.Scroller; public class CustomView extends LinearLayout { private static final String TAG = "Scroller" ; private Scroller mScroller; public CustomView (Context context, AttributeSet attrs) { super (context, attrs); mScroller = new Scroller (context); } public void smoothScrollTo (int fx, int fy) { int dx = fx - mScroller.getFinalX(); int dy = fy - mScroller.getFinalY(); smoothScrollBy(dx, dy); } public void smoothScrollBy (int dx, int dy) { mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy); invalidate(); } @Override public void computeScroll () { if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } super .computeScroll(); } }
ScrollerDemo.rar