源码学习Android属性动画流程

1、使用属性动画
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "x", 0f, 360f);
animator.setDuration(1000);
animator.start();

以上是使用属性动画的简单例子,从start方法开始执行

2、ObjectAnimator.start
//ObjectAnimator.start
public void start() {
   
    AnimationHandler.getInstance().autoCancelBasedOn(this);
    super.start();
}

//ValueAnimator.start
public void start() {
   
    start(false);
}
private void start(boolean playBackwards) {
   
    if (Looper.myLooper() == null) {
   
        throw new AndroidRuntimeException("Animators may only be run on Looper threads");
    }
    //一大段代码做状态设置,省略了
    ....
    
    addAnimationCallback(0); //见3

    if (mStartDelay == 0 || mSeekFraction >= 0 || mReversing) {
   
        startAnimation();
        if (mSeekFraction == -1) {
   
            setCurrentPlayTime(0);
        } else {
   
            setCurrentFraction(mSeekFraction);
        }
    }
}

主要是设置下状态属性,addAnimationCallback(0)跟踪进去

3、ValueAnimator.addAnimationCallback
private void addAnimationCallback(long delay) {
   
    if (!mSelfPulse) {
   
        return;
    }
    //见4、5
    getAnimationHandler().addAnimationFrameCallback(this, delay);
    //这里的参数this是AnimationFrameCallback接口的实现,ValueAnimator实现了该接口
}
4、getAnimationHandler
public AnimationHandler getAnimationHandler() {
   
    return AnimationHandler.getInstance();
}
public static AnimationHandler getInstance() {
   
    if (sAnimatorHandler.get() == null) {
   
        sAnimatorHandler.set(new AnimationHandler());
    }
    return sAnimatorHandler.get();
}

主要是获取当前线程的AnimationHandler实例

5、AnimationHandler.addAnimationFrameCallback
 public void addAnimationFrameCallback(final AnimationFrameCallback callback, long delay) {
   
    if (mAnimationCallbacks.size() == 0) {
   
        // 见6
        getProvider().postFrameCallback(mFrameCallback);//注意mFrameCallback
    }
    if (!mAnimationCallbacks.contains(callback)) {
   
        mAnimationCallbacks.add(callback);
    }

    if (delay > 0) {
   
        mDelayedCallbackStartTime.put(callback, (SystemClock.uptimeMillis() + delay));
    }
}

//mFrameCallback的实现
private final Choreographer.FrameCallback mFrameCallback = new Choreographer.FrameCallback() {
   
    @Override
    public void doFrame(long frameTimeNanos) {
   
        doAnimationFrame(getProvider().getFrameTime());
        if (mAnimationCallbacks.size() > 0) {
   
            getProvider().postFrameCallback(this);
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值