Android动画原理分析

简单描述为:将View的一次大的属性变化拆分为多次小的属性变化,在每次VSYNC信号到来时,根据当前时间和插值器来计算当前View属性的值,然后给该View设置该属性值,直到动画执行完毕。其中Choreographer将动画拆分成一次次小的属性变化,Choreographer是动画的指挥者。理想情况下,属性刷新次数(动画拆分为多次小的属性变化)=动画执行时间/16.7ms。

我们从以下4个问题来讲解动画原理:

1:动画如何完成一次属性变化刷新?

点击按钮,开始执行透明度动画,直到动画结束。

下面就第一个问题进行源码分析,

首先从valueAnimator.start()开始:

1 设置相关标志位

2 这是个关键方法,动画循环中在该方法中实现。

3 初始化相关属性。

继续看核心方法:


由于ValueAnimator实现了AnimationHandler.AnimationFrameCallback接口。

1 动画开始执行时,mAnimationCallbacks.size是为0的,所以就会执行判断语句里面的方法getProvider().postFrameCallback(mFrameCallback);

2 将ValueAnmiator(实现了AnimationFrameCallback)添加入mAnimationCallbacks列表。

下面分析这句代码

是一个接口调用,下面我们看是谁实现了这个接口。



1 Choreographer收到VSYNC都会调用该方法,正常情况下16.7ms就会调用一次doframe。

2 再次将自己post到编舞者中,以便下次收到底层信号时,继续调用doFrame来刷新动画。


1 callback就是我们添加到mAnimationCallbacks列表中的ValueAnimator

2 执行ValueAnimator的doAnimationFrame方法;


1 在animateBaseOnTime中刷新View属性,并判断动画是否执行完毕

2 如果动画结束执行endAnimation。

1 首先将done布尔值为false,表示动画是否执行完毕,

2 这个值在ValueAnimator.startAnimator中将mRunning设置为true。

3 根据当前时间currentTime来判断动画是否执行完毕。

4 将dong值设置为true

5 计算当前View属性值,然后设置View相关属性。

下面继续看

1 getTarget返回的就是ValueAnimator valueAnimator = ObjectAnimator.ofFloat(mButton, "alpha", 1.0f, 0f);这句中的View也就是mButton。

2 调用父类,主要是计算当前动画的进度。

3 调用PropertyValueHolder.setAnimatorValue设置mButton在该帧的透明度

下面分析一下父类ValueAnimator的animateValue方法

1 根据插值器计算当前属性动画的进度。

2 android.animation.PropertyValuesHolder#calculateValue 

将当前进度存放到PropertyValuesHolder.mAnimatedValue中,在AnimatorUpdateListener.onAnimationUpdate方法中可以通过ValueAnimator.getAnimatedValue获取动画进度。

3 回调AnimatorUpdateListener.onAnimationUpdate方法。


1 如果有属性,通过set方法来更新属性值。

2 如果需要通过反射来调用的setter方法来更新属性值。

以上流程就是完成了mButton透明度的一次更新,同时也说明了动画是如何完成一次属性变化的刷新。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 《Android开发艺术探索》第三章弹性滑动中有这么一段话:”如何实现弹性滑呢?实现方法有很多,但它们都有一...
    htkeepmoving阅读 4,924评论 1 12
  • 1、基本特点 属性动画是从Android3.0开始的动画框架,功能和扩展性都很强,可以实现补间动画所有的效果。 功...
    码上修行阅读 1,155评论 0 2
  • 动画分类Android动画可以分3种:View动画,帧动画和属性动画;属性动画为API11的新特性,在低版本是无法...
    施洛辛阅读 1,143评论 0 0
  • 动画分类 补间动画 旋转、位移、透明度、缩放 属性动画 同样的属性动画也可以做到对View进行缩放、移动、旋转以及...
    杨殿生阅读 344评论 0 1
  • 一、前言 关于什么是动画,动画的相关概念等等这里就不讲了。这里仅表述一下个人观点,个人认知是:1.动画增加了 UI...
    仰简阅读 8,509评论 7 36

友情链接更多精彩内容