Animation源码分析

一、概述

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) {
   <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值