动画创建

先看入口函数:

参数很熟悉了,具体看里面做了什么,其实也很简单,创建一个实例对象,并将参数设置到对象中。
第一个参数暂时先不看,看第二个参数,**anim.setObjectValues(values)**


重点是 valuesHolder.setObjectValues(values);

这里把输入的参数值传给了 KeyframeSet这个类,这个类很重要!

在KeyframeSet 里面,将所有的参数值保存到一个 Keyframe数组中,这个Keyframe可以类比Map,键值对保存参数值,其中key是fraction,也就是随时间变化的系数,但是这个里面是根据数组下标占总数的百分比来求得(这里面就存在一个隐藏坑,具体看《动画插值器源码分析》一文),value就是对应的参数值。

这就是一般创建动画时的执行流程,接着来看动画执行部分!

动画执行

先看入口函数:

其中的关键代码如下:

首先是开始执行动画,接着由于这个 **mSeekFraction** 值默认是-1 ,
因此后续会进入 setCurrentPlayTime(0);

先来看开始动画,如下图,重要的是进行了动画的初始化 initAnimation(); 。

进入该函数会发现主要是对value值进行了初始化。

初始化代码如下图:

可以看到初始化其实就是设置估值器,也就是 evaluator ,而这个是咱们经常自定义重写的关键类!

开启动画到这里基本就走完了,接着来看初始化动画值!也就是setCurrentPlayTime这个函数了,如下图:

其实他就是调用了之前经常看到的setCurrentFraction 这个函数,顾名思义,该函数就是设置当前的fraction(基于开始时间)。

其中的核心代码就是 animateValue(currentIterationFraction) 这一行,进入该函数可以看到第一行就出现了我们非常熟悉的东西——Interpolator , 这个东西可以由我们自定义改写其中的规则,当然系统也有写好的供我们使用,他的作用就是将 fraction 按照一定的规则算法改变,而这个fraction从上文可知是和value值一对一匹配的。

接着就是for循环执行 mValues[i].calculateValue(fraction) ,这行代码的作用就是根据fraction算出具体的动画属性值!如下图:

果然,看到了熟悉的 keyframe ,进去看看!代码很长,但是我还是全部贴出来了,因为都很重要!

这个函数前半部分对只有2个值的情况做了特殊优化,并且对于fraction 超出[0,1]范围的情况做了特殊处理,直接去边界值进行估值计算(这里面就存在一个隐藏坑,具体看 动画插值器源码分析 )!

后半部分代码的作用是从第二帧开始,每一帧的fraction和前一帧的fraction组成一个区域,根据传入的fraction在区域的百分比来执行动画插值,当然这个百分比也是可以通过咱们自己的 Interpolator拦截修改掉的!最后,将这两帧值和百分比fraction传入估值器进行估值!

到此,动画就开始执行了,接着看动画的具体执行!

动画刷新

大家知道Android系统的运行机制是一个无限循环的消息机制,不例外的动画也是一个消息刷新机制,Choreographer这个单词的意思是编舞者,顾名思义,负责动作画面的指导!动画的刷新机制就从这里开始触发!关键代码 doAnimationFrame(getProvider().getFrameTime());

进入该行代码,其中的关键代码是 callback.doAnimationFrame(frameTime);,而这个callback谁实现了呢?没错,就是 ValueAnimator

进入ValueAnimator的回调函数中,如下图,代码很长,我会截取其中的关键部分。

可以看到,代码的最后进到了这行代码: animateBasedOnTime(currentTime);

这里面首先会根据当前时间和开始时间来计算动画执行的fraction,但是这里需要注意的是如果你是无限循环动画的话,你的fraction有可能不会到1.0 或者0.0 (这里是另一个坑)!因为Android系统的Choreographer 这个函数是根据系统的VSYNC信号来触发的,而VSYNC的数值是和刷新率有关系的!而这个函数会约束fraction在[0,1]之间,却没有保证一定能够到达两端!

接着会先通知OnRepeat回调函数的执行!最后便是上文提到的动画属性值的计算!

到此,整个动画的基本流程已经梳理通畅了!可以愉快的编(写)代(八)码(哥)了!

Android动画分析(ValueAnimator)相关推荐

  1. android动画分析

    原文链接  http://blog.csdn.net/u010375364/article/details/51846401  侵删 补间动画 view animation 移动 旋转 缩放 透明度 ...

  2. Android 动画分析之Tween动画分析

    前言: 我们选择了android开发或ios开发,是不是见到不错的app,就想看看他们的一些动画效果,交互体验,以及一些有创意的功能.今天我们就来一起学习讲解android中的动画,以及动画原理,以便 ...

  3. Android动画之LayoutTransition布局动画

    动画入门和进阶文章列表: Animation动画概述和执行原理 Android动画之补间动画TweenAnimation Android动画之逐帧动画FrameAnimation Android动画之 ...

  4. Android动画之AnimatorSet联合动画用法

    动画入门和进阶文章列表: Animation动画概述和执行原理 Android动画之补间动画TweenAnimation Android动画之逐帧动画FrameAnimation Android动画之 ...

  5. Android动画之逐帧动画FrameAnimation

    动画入门和进阶文章列表: Animation动画概述和执行原理 Android动画之补间动画TweenAnimation Android动画之逐帧动画FrameAnimation Android动画之 ...

  6. Android动画了解—一些项目案例分析

    文章目录 写在前面 带路径运动的过渡动画 整体缩放的效果 整体宽高改变的过渡效果 两个界面布局的过渡效果 带水波纹布局的效果 几行代码实现转圈圈的效果 界面翻转的效果 写在前面 最近听说MIUI 12 ...

  7. android动画如何更新UI(ValueAnimator源码解析)

    概述 android动画经常会碰到卡顿,或者阻塞主进程之类的问题. 为了排查此类问题,不得不对动画原理了解一二,于是作此文. 此文围绕两个主线问题展开: ui更新的频率是如何控制的? 比如,1秒内会更 ...

  8. Android动画技术分析

    Android动画技术分析 本文将介绍Android动画的实现技术.Android动画实现有三种技术,逐帧动画(Drawable Animation),补间动画(View Animation)和属性动 ...

  9. android 动画卡顿分析工具

    android 动画卡顿分析工具 Android应用性能优化之分析工具 上一次记录了解决过度绘制的过程,这一次,想先弄清个概念性的东西,就是如何判断顺不顺畅? 这东西其实最初我自己也觉得有点废话,用起 ...

最新文章

  1. appium+python自动化45-夜神模拟器连不上(adb server version (36) doesn't match this client (39); killing...)...
  2. R语言sys方法:sys.timezone函数返回当前系统时区的名称、system.File函数查找系统文件或者安装包的文件路径(例如查看R Base可安装路径、dplyr包的安装路径)
  3. python 格式化字符串_Python字符串三种格式化输出
  4. [Qt教程] 第47篇 进阶(七) 定制Qt帮助系统
  5. java类与对象明星,明星档案的
  6. CSS块元素水平垂直居中的实现技巧
  7. 利用socket实现java程序自动关闭
  8. stream流常用方法_Java8-Stream关键知识点
  9. 批量操作权限的页面展示
  10. 量化因子投资的至暗时刻,2018远比你想象得要惨烈
  11. Windows bat命令解压缩文件360zip
  12. python 基础知识复习巩固
  13. SSM项目实战之十:用户信息查询
  14. 最新 行政区划 省市区 历史版 2022 年
  15. xp计算机设置密码6,如何设置开机密码_xp系统电脑设置开机密码的方法 - 驱动管家...
  16. steam社区打不开,解决mac无法打开steam社区的方法
  17. nmap架构图_Nmap扫描教程之Nmap基础知识
  18. dingo php,Laravel Dingo API
  19. 视觉欺骗 A和B的颜色相同吗?
  20. Xcode4.6 自制iOS可用的 Framework

热门文章

  1. java 参数传递为空_java 参数传递 空对象 null
  2. 高管离职,业绩欠佳!出狱一年的黄光裕,如何实现自己豪言壮语?
  3. 全息投影是怎么实现人机交互的吗?
  4. 芝麻信用网页api php,PHP芝麻信用接入的注意事项
  5. html那些说不定你不知道的知识。
  6. 用JS来动态设置CSS样式的八种方式
  7. 2023 年的电动汽车充电趋势和电动汽车的未来
  8. 异星工厂mod位置linux,异星工厂存档在哪里
  9. 从云监工到云登顶,5G云直播见证中国速度
  10. Spring Cloud Gateway 入门示例