在android开发中,遇到一个需求是视图上下滚动的动画效果。为了简单,想当然使用了ValueAnimator,实现方法如下面示例代码中的animateScrollY0函数。效果是实现了,但在测试中发现偶尔会有一下卡顿的现象。卡顿不是固定的,也就那么十次中才有一两次。出现也非常随机,没有规律,很是恼人。让我想不通的是,android自己的ValueAnimator,我又没做改动,怎么会出现卡顿呢?
不得不换一种实现方式,实现方法如下面示例代码中的animateScrollY1函数。定义了一个Scroller,然后重写了View的computeScroll函数。这次就没有出现卡顿现象了。
package hello.android;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
import android.widget.FrameLayout;
import android.widget.Scroller;
public class ScrollView extends FrameLayout {
private Scroller mScroller;
public ScrollView(Context context) {
super(context);
mScroller = new Scroller(context);
}
@Override
public void computeScroll() {
super.computeScroll();
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
}
public void animateScrollY0(int startY, int endY, int duration) {
ValueAnimator valueAnimator = ValueAnimator.ofInt(startY, endY);
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
int scrollY = (Integer) animator.getAnimatedValue();
scrollTo(0, scrollY);
}
});
valueAnimator.setDuration(duration);
valueAnimator.start();
}
public void animateScrollY1(int startY, int endY, int duration) {
int dy = endY - startY;
mScroller.startScroll(0, startY, 0, dy, duration);
invalidate();
}
}