如此简单的Scroller

来源:互联网 发布:网络电视机顶盒选购 编辑:程序博客网 时间:2024/05/22 05:26

首先:

//初始化
Scroller scroller = new Scroller(context);

然后:

//开始滑动,也就是设置参数
scroller.startScroll(“开始位置x”, “开始位置y”, “要改变的位置x(这是变化量,也就是差值)”, “要改变的位置y(这是变化量,也就是差值)”, “时间,也就是,多久完成这个动作”);
invalidate();

最后:

@Override
public void computeScroll() {
if (scroller != null && scroller.computeScrollOffset()) {

/**
这里就可以进行写滑动或者改变view大小高度的操作。例如scrollto()等。。
scroller.getCurrX(y)();//通过源码可以看到这个是开始xy+变化量Xy
**/

postInvalidate();
}
super.computeScroll();
}

总结:
scroller并不具备滑动或者改变view宽高等功能。startScroll(),这个方法只是记录了要用到的所有参数。然后通过调用
invalidate()重绘;这个方法间接的调用到draw() 方法,draw()方法又要调用computeScroll()。然后postInvalidate();又会紧接着第二次重绘。
其中:computeScroll()是主要实现功能的方法,可以在里面进行滑动或者放大view等操作。参数可以通过scrller直接get到,因为start的时候记录了要用的参数。

疑问:为什么可以再指定时间内完成这些操作呢?也就是他是怎么定时的呢?
原理还是很简单的:比如你要从1数到100,在1000s完成。这个很简单啊,每10s数一下啊。。。。。

例如:当你要指定时间改变x轴滑动的距离,其中”要改变的位置x(这是变化量,也就是差值)”为500px,那么我要在1000毫秒完成,那么每过2毫秒滑动1px,就可以。以这种比例去执行computeScroll();最终就可以在1000毫秒滑动500px.(虽然源码中还有速度差值之类的处理,但是道理大概就是这个样子)

1 0