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) {
return false;
}
int timePassed = (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime);
if (timePassed < mDuration) {
switch (mMode) {
case SCROLL_MODE:
float x = timePassed * mDurationReciprocal;
if (mInterpolator == null)
x = vi