前面一篇博文《关于View的ScrollTo, getScrollX 和 getScrollY》,我们讲解View 的scrollTo() 和 getScrollX() 的功能,也提到了它们其实是一般是配合scroller 类来进行屏幕的滑动的。有的朋友可能会问,为什么有了scrollTo() 之后,还要有scroller 类呢,区别在于,scrollTo() 和 scrollBy() 他们实现的是一个结果,也就是说,当你调用scrollTo(100, 0) 的时候,再重新绘制的时候,内容就已经出现在(100,0)的位置上了,缺少一个过程,而scroller 类就是来帮助我们展现这个滚动的过程的。
动画的原理其实是不停地重绘位置变化的内容,在视觉效果上,就会产生动画的效果。scroller 类的原理其实也正是如此,通过循环地绘制不同位置上的内容,来展现屏幕滚动。
它的原理图大概如下:
这样讲就太抽象了,还是结合例子来看看吧。
拿上次写的自定义ViewGroup, 我们来进行扩展一下,代码如下:
public class CustomRotateViewGroup extends ViewGroup implements OnTouchListener{
private static final int snapVelocity = 200;
private static final int rows = 3;
private static final int padding = 10;
private Scroller mScroller;
private float downX;
private float curX;
private int distanceX;
private int screenWidth;
private VelocityTracker velocityTracke