Android自定义View——动画学习笔记

Posted by Csming on 2017-01-20

实质

每一帧绘制不同内容

基本过程

开始动画后,调用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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MyView extends View {
void startAnimator() {
ValueAnimator animator = ValueAnimator.ofFloat(1f, 0f);
animator.start();
invalidate();
}
protected void onDraw(Canvas canvas) {
if (animator.isRunning()) {
float ratio = (Float)animator.getAnimatedValue();
canvas.rotate(ratio*360);
canvas.drawBitmap(bitmap, 0, 0, null);

invalidate();
}
...
}
}

考虑动画实现的时候一般从两个角度来思考:

宏观角度:有几个变化量,分别是什么。动画从开始到结束的流程。

微观角度:从某一帧上去想,在变化量为某个数值时的图像,该怎么绘制。

把这两者分开去想,就会比较清晰。


出处:http://www.cnblogs.com/zhucai/p/android-graphics-animation.html