Android Animation 机制详解
目录
[TOC]
本篇博客我将和大家一起学习Android Animation的实现原理, 而不是Animation的使用
Animation的分类
-Tweend动画即通过对场景里的对象不断做图像变换 ( 平移、缩放、旋转 ) 产生动画效果
-Frame 动画即顺序播放事先做好的图像,跟电影类似
Android 动画框架原理
要了解Android动画是如何加载出来的,我们首先要了解Android View 是如何组织在一起的.每个窗口是一颗View树. RootView是DecorView,在布局文件中声明的布局都是DecorView的子View.是通过setContentView来设置进入窗口内容的. 因为View的布局就是一棵树.所以绘制的时候也是按照树形结构来遍历每个View进行绘制.ViewRoot.java中 draw函数准备好Canvas后 调用 mView.draw(canvas),这里的mView是DecorView.下面看一下递归绘制的几个步骤:
1.绘制背景
2.如果需要,保存画布(canvas),为淡入淡出做准备
3.通过调用View.onDraw(canvas)绘制View本身的内容
4.通过 dispatchDraw(canvas)绘制自己的孩子,dispatchDraw->drawChild->child.draw(canvas) 这样的调用过程被用来保证每个子 View 的 draw 函数都被调用
5.如果需要,绘制淡入淡出相关的内容并恢复保存的画布所在的层(layer)
6.绘制修饰的内容(例如滚动条)
当一个 ChildView 要重画时,它会调用其成员函数 invalidate() 函数将通知其 ParentView 这个 ChildView 要重画,这个过程一直向上遍历到 ViewRoot,当 ViewRoot 收到这个通知后就会调用上面提到的 ViewRoot 中的 draw 函数从而完成绘制。Android 动画就是通过 ParentView 来不断调整 ChildView 的画布坐标系来实现的
动画的具体实现
Animation动画Transformation顾名思义 :变化Animation 中主要定义了动画的一些属性比如开始时间、持续时间、是否重复播放等在Animation中有两个重要的函数:
1.getTransformation getTransformation 中 Animation 会根据动画的属性来产生一系列的差值点,然后将这些差值点传给 applyTransformation
2.applyTransformation 这个函数将根据这些点来生成不同的 Transformation
Transformation中包含一个矩阵和 alpha 值,矩阵是用来做平移、旋转和缩放动画的,当调用dispatchDraw时会调用getTransformation来得到当前的Transformation**,如下:
所以具体的动画只需要重载 applyTransformation 这个函数即可
读到这里,相信大家应该对animation的原理有所了解. 如果你感觉这篇文章很难理解,建议先去学习有关的基础知识.欢迎大家提问,互相进步.
[footnote][footnote]: 这是一篇笔记,供大家学习和参考---------