一、概述
Android属性动画的启动方式:
// 创建动画对象,详见下面
ObjectAnimator anim = ObjectAnimator.ofFloat(targetObject, "alpha", 0f, 1f);
// 设置动画时间
anim.setDuration(2000);
// 开启动画,详见下面
anim.start();
二、流程
2.1 ObjectAnimator.ofFloat
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {
// 创建ObjectAnimator对象,并指定target对象和属性名。
ObjectAnimator anim = new ObjectAnimator(target, propertyName);
// 然后setFloatValues(values)方法,经几次调用,最后调用KeyframeSet.ofFloat(values),
// 创建了一个只有起始帧和结束帧(2-keyframe)的KeyframeSet对象。
anim.setFloatValues(values);
return anim;
}
2.2 ObjectAnimator.start
public void start() {
// 如果之前有动画在执行,那么会回调ValueAnimator.cancel()方法,终止之前的动画。
AnimationHandler.getInstance().autoCancelBasedOn(this);
super.start();
}
2.3 ValueAnimator.start
private void start(boolean playBackwards) {
// 增加VSYNC的回调监听,用于更新动画
addAnimationCallback(0);
if (mStartDelay == 0 || mSeekFraction >= 0 || mReversing) {
// 非延迟动画,开启动画,这里主要是设置开启标志位且回调用户设置的onAnimationStart()
startAnimation();
if (mSeekFraction == -1) {
// 设置动画重头开始,内部还是调用了setCurrentFraction(),这里面的关键代码是animateValue()
setCurrentPlayTime(0);
} else {
// 设置动画从某一段开始,有点像看视频的时候拖动了进度条
setCurrentFraction(mSeekFraction);
}
}
}
2.3.1 animateValue
void animateValue(float fraction) {
// 默认插值器是AccelerateDecelerateInterpolator,通过它获取当前的帧的fraction
fraction = mInterpolator.getInterpolation(fraction);
mCurrentFraction = fraction;
int numValues = mValues.length;
for (int i = 0; i < numValues; ++i) {
<