Android 中有两大动画体系, 一个为3.0以前的补间动画,帧动画. 一个为3.0之后新增的属性动画. 由于旧的动画体系有诸多缺陷,使用过程有很多坑.所以当前流行的大多都是属性动画.
属性动画原理:
新增的属性动画并非是单独针对View动画的, 他是一组由值动画体系补充而形成的针对Object get/set属性进行插值操作的一系列API.
简单点讲,就是Android 将新的动画体系依托于每秒60帧的刷新同步信号(VSYNC), 在每次同步信号到来之后固定的增加了一步, 就是执行当前动画队列里的所有动画. 也就是每隔~16ms 会步进一次所有的动画.
属性动画的注意事项:
- 属性动画的性能问题.
属性动画是否流畅是动画最基本要考虑的重要指标. 根据属性动画的原理,实际上动画是否流畅取决于是系统当前是否有丢帧. - 属性动画的焦点问题.
属性动画包含位移,旋转,缩放等.考虑一个最简单的情形, 当我们通过动画移动某个View到另外的位置时,此时点击什么位置才能响应其点击事件. 答案是: 点击移动到的新的目标位置能够响应View的点击事件.
同样的 缩放和旋转等操作, 也将同样的修改View的点击区域为新的View的边界区间.
那有人要问了, 经过动画后的View的 矩形区间是哪里呢? 答案是: View的坐标空间,矩形大小并未产生改变,还是在原来的位置. 我们可以打开 开发者选项, 并打开View布局边界显示,来查看每个View的位置空间.
那为什么点击事件响应会变化到新的空间呢? 这要从View的属性动画支持原理上来说了. View针对属性动画有一个TransformationInfo 结构用来保存动画所需的各属性. 同时有一个mMatrix 属性来保存当前属性变化的矩阵. 也就是说,针对View的动画最终会转换成对矩阵的运算. 同样的, 点击坐标也会相应的基于此矩阵进行变换, 最终还原成未动画时点击的位置坐标. 这样当我们点击动画后的View 位置时,实际坐标会转换成未动画时的位置坐标. 这样就可以简单判断点击是否落在View 矩形空间内. 以此来触发点击操作.

本文介绍了Android中属性动画的原理及其实现方式,并讨论了动画的性能问题和焦点问题。属性动画利用每秒60帧的刷新同步信号,在每次同步信号到来后执行动画队列里的所有动画,实现流畅的动画效果。
1348

被折叠的 条评论
为什么被折叠?



