Android 属性动画的一些思考

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

Android 中有两大动画体系, 一个为3.0以前的补间动画,帧动画. 一个为3.0之后新增的属性动画. 由于旧的动画体系有诸多缺陷,使用过程有很多坑.所以当前流行的大多都是属性动画.

属性动画原理:

新增的属性动画并非是单独针对View动画的, 他是一组由值动画体系补充而形成的针对Object get/set属性进行插值操作的一系列API.
简单点讲,就是Android 将新的动画体系依托于每秒60帧的刷新同步信号(VSYNC), 在每次同步信号到来之后固定的增加了一步, 就是执行当前动画队列里的所有动画. 也就是每隔~16ms 会步进一次所有的动画.

属性动画的注意事项:

  1. 属性动画的性能问题.
    属性动画是否流畅是动画最基本要考虑的重要指标. 根据属性动画的原理,实际上动画是否流畅取决于是系统当前是否有丢帧.
  2. 属性动画的焦点问题.
    属性动画包含位移,旋转,缩放等.考虑一个最简单的情形, 当我们通过动画移动某个View到另外的位置时,此时点击什么位置才能响应其点击事件. 答案是: 点击移动到的新的目标位置能够响应View的点击事件.
    同样的 缩放和旋转等操作, 也将同样的修改View的点击区域为新的View的边界区间.
    那有人要问了, 经过动画后的View的 矩形区间是哪里呢? 答案是: View的坐标空间,矩形大小并未产生改变,还是在原来的位置. 我们可以打开 开发者选项, 并打开View布局边界显示,来查看每个View的位置空间.

那为什么点击事件响应会变化到新的空间呢? 这要从View的属性动画支持原理上来说了. View针对属性动画有一个TransformationInfo 结构用来保存动画所需的各属性. 同时有一个mMatrix 属性来保存当前属性变化的矩阵. 也就是说,针对View的动画最终会转换成对矩阵的运算. 同样的, 点击坐标也会相应的基于此矩阵进行变换, 最终还原成未动画时点击的位置坐标. 这样当我们点击动画后的View 位置时,实际坐标会转换成未动画时的位置坐标. 这样就可以简单判断点击是否落在View 矩形空间内. 以此来触发点击操作.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值