答:跟上面一样,会死循环刷新View,只是由于Y坐标不断的在变化,导致了View根据Y坐标变化规律上下移动,这样一来,如果Y坐标的变化是有规律的,是慢慢向下移动的,那这就达到了我们今天要研究的效果----平滑移动了;而这里我们今天要谈的Scroller就是这样一个工具类,给我们提供有规律变化的坐标的工具类;嘿嘿,似乎发现了什么…
有种拨云见日的感觉啊,原来平滑移动如此easy,那么与其说Scroller是Android中View平滑移动的一个辅助类,不如直接说Scroller是一个计算坐标的工具类。其实Scroller与View的滑动是没有关系的,它只是计算在动画执行某个时间所在的某个位置的坐标,这样就形成了坐标路线,再view根据坐标路线循环invalidate在界上新显示,就形成了我们看到的平滑移动了。
知道了Scroller的工作原理,下面根据源码分析一下Scroller类常用的几个方法:
1、startScroll()方法:
源码:
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
mMode = SCROLL_MODE;
mFinished = false;
mDuration = duration;
mStartTime = AnimationUtils.currentAnimationTimeMillis();
mStartX = startX;
mStartY = startY;
mFinalX = startX + dx;
mFinalY = startY + dy;
mDeltaX = dx;
mDeltaY = dy;
mDurationReciprocal = 1.0f / (float) mDuration;
}
简单到让人无法相信,仅仅是设置了一下动画开始时间,起始坐标,终点坐标、时间倒数(仅仅是方便计算而已)等变量而已;其实这样我们的动画可以说已经开始了,只是没有根据坐标绘制到界面上而已;因为它这里保存了开始时间,当平滑开始的时候,Scroller就可以根据滑动的时间差来计算当前坐标应该处的位置,View根据坐标invalidate就可以滑动了;
当然这里影响到坐标计算的还有一个就是加速器,在重载的构造方法方法 public Scroller(Context context, Interpolator interpolator) 里面有详述:这里我们也可以自定义自己的加速器,具体原理与如何自定义这里就不阐述了;
2、computeScrollOffset()方法:
public boolean computeScrollOffset() {
if (mFinished