实质
每一帧绘制不同内容
基本过程
开始动画后,调用View的invalidate触发重绘。重绘后检查动画是否停止,若未停止则继续调用invalidate触发下一帧(下一次重绘),直到动画结束。
重绘时View的draw方法会被调用,根据动画的进行绘制不同的内容,如某个被绘制元素的大小变化、角度旋转、透明度变化等,这样即会产生动画。
动画的推进过程一般都会有一个变化量,这个变量会被用到draw方法内元素的绘制。一般的变量都是时间,也可以是手指移动、传感器等任何其他的变量
Android中的动画支持
Animation:早期实现的让View整体做动画的类。能让View做Matrix(移动、缩放、旋转、3D旋转)和Alpha(透明)的动画。
Animator:有硬件加速后为做动画实现的类。能方便的让View整体做动画;也可以只产生随时间变化的变量,用来在onDraw里做绘图级的动画。比Animation灵活很多。
AnimationDrawable:图片逐帧动画。主要用来播放提前制作好的动画。
绘图级与View级
让整个View做动画(比如整个View平移、旋转等)很简单方便,一般调用几行代码就行。
在View的draw/onDraw里通过Canvas来绘制时做动画更灵活,更精细,能力更强大。(View级的动画本质上也是这么做的,只是Android系统帮我们做了大部分工作)
绘图级的动画
1 | class MyView extends View { |
考虑动画实现的时候一般从两个角度来思考:
宏观角度:有几个变化量,分别是什么。动画从开始到结束的流程。
微观角度:从某一帧上去想,在变化量为某个数值时的图像,该怎么绘制。
把这两者分开去想,就会比较清晰。
出处:http://www.cnblogs.com/zhucai/p/android-graphics-animation.html