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 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(); } }
invalidate和postInvalidate区别 两者作用一样都是通知UI刷新,但是invalidate只能在UI线程中调用,postInvalidate则在非UI线程中调用
scrollTo(x,y)是View的方法,其中x,y参数可以理解为View的左上角坐标从(0,0)移动到(x,y) 举例说明scrollTo(-5,10)就是向右移动5``向下移动10