android 的scroller的使用

理解

我把scroller理解为滚动数据携带器,他只是一个记录滚动数据的工具,并不显示view的滚动效果,其实这点我觉得和安卓的属性动画挺像,他只提供数据,具体要怎么做,就看你的了。

scroller的两个重要方法

1.mScroller.startScroll(0, 0, 0, 0, 1000)

前面的两个参数是起始坐标x,y,中间两个参数是对应的偏移量,最后一个参数是执行时间。

2.mScroller.computeScrollOffset()

判断是否完成滚动,这个函数会一直返回false,直到滚动完毕返回true。

获取Scroller携带的位置数据

mScroller.getCurrX() //获取mScroller当前水平滚动的位置
mScroller.getCurrY() //获取mScroller当前竖直滚动的位置
mScroller.getFinalX() //获取mScroller最终停止的水平位置
mScroller.getFinalY() //获取mScroller最终停止的竖直位置
mScroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置
mScroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置

使用

ViewGroup中有个computeScroll方法,ontouch或invalidate()或postInvalidate()都会导致这个方法的执行,
所以我们可以手动执行ViewGroup方法,同时再computeScroll中执行postInvalidate(),这就会形成一个循环,我们在这个循环中调用ViewGroup的scrollTo方法更新位置信息,同时使用mScroller.computeScrollOffset()方法监听滚动是否完毕。

public class MyView extends LinearLayout {
    private boolean s1 = true;
    Scroller mScroller = null;

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mScroller = new Scroller(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void computeScroll() {
        if (mScroller.computeScrollOffset()) {
            scrollTo(mScroller.getCurrX(), 0);
            postInvalidate();
        }
    }
   //需要手动执行这个方法
    public void beginScroll() {
        if (!s1) {
            mScroller.startScroll(0, 0, 0, 0, 1000);
            s1 = true;
        } else {
            mScroller.startScroll(0, 0, 500, 0, 1000);
            s1 = false;
        }
        invalidate();
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容