您的位置:首页 > 移动开发 > Android开发

Android 属性动画的一些思考

2018-02-27 00:35 281 查看
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 矩形空间内. 以此来触发点击操作.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: