android 的scroller的使用

2015-11-25  本文已影响1875人  Tenny1225

理解

我把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();
    }

上一篇下一篇

猜你喜欢

热点阅读