Android动画

来源:互联网 发布:nginx 在线人数统计 编辑:程序博客网 时间:2024/06/03 05:51

一、Android动画类别

Android系统动画有三种类型分别是视图动画(View Animation)、属性动画(Property Animation)、帧动画(Drawable Animation),其中属性动画是Android 3.0之后引入的,使用时要注意兼容性的问题。


图1 Android动画类别

 

二、View Animation的特点

1、使用简单、能满足大部分需求,更少的代码,更快,更简单。

2、只是显示视图变化,实际View的属性例如(位置、边框等)是不会变化的,比如点击事件的区域不变。无法改变non-view的元素。

3、另外如果一个View的View Animation 超出了父控件的边框,将会被裁减掉。

4、补间动画,顾名思义就是给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。

5、一般使用补间动画(Tween Animation),其中包括translate、alpha、scale、rotate。

三、Property Animation的特点

1、扩展性好、更灵活、更强大,但是版本需求高,需要Andorid3.0及以上系统(API Level 11)。

2、可以改变view or non-view(非视图相关)的属性,例如包括(颜色、位置、大小等)。

3、新增了Frame refresh delay属性,表示帧刷新延迟,默认10ms,具体多少依赖系统总体上的繁忙程度和优先级。

4、相关的动画文件位于res/animator/目录,在xml中animator、objectAnimator、set 分别对应ValueAnimator、ObjectAnimator、AnimatorSet。

 

四、Drawable Animation的特点

1、相关资源文件位于res\anim文件夹。

2、以animation-list为根节点,animation-list根节点中包含多个item子节点,每个item节点定义一帧动画,当前帧的drawable资源和当前帧持续的时间。

3、AnimationDrawable可以从xml中导入动画,也可以在code中添加动画帧。

4、需要注意的是,不能直接在onCreate的时候启动帧动画,因为这个时候AnimationDrawable没有完全与window关联起来。可以在onWindowFocusChanged()中启动动画。

Drawable Animation不推荐优先使用,特别是需求图片资源多,并且图片大时。

 

五、自定义动画

当系统自带的动画满足不了我们的要求时,这个时候就要自定义动画。自定义动画有多种形式,常见的做法有以下几种:

1、继承Animation并重写applyTransformation()方法实现动画

2、使用Matrix实现动画

3、通过Scroller控制View的手势动画

4、在View.onDraw()中使用Canvas绘制动画

 

六、Android动画原理

Animation框架是建立在View的级别上的,在View类中有一个startAnimation()方法来使动画开始,startAnimation()方法会将一个Animation类别的参数传给View。这个函数的源码如下:

public void startAnimation(Animation animation) {

    animation.setStartTime(Animation.START_ON_FIRST_FRAME);

    setAnimation(animation);

    invalidateParentCaches();

    invalidate(true);

}

其中最重要的方法就是invalidate()方法,这个方法会一直向上调用它ViewParent的方法,直到调用到ViewRootImpl类的performTraversals()方法,这个方法就是最根本的遍历View层次树的方法,如下图所示:


图2 Android动画invalidate方法遍历过程

要想理解动画原理,必须先理解View层次树,也就是说,View是怎样被Android系统组织起来的,以及它们是怎样画自己内容的。

一个App一般只有一个Window,而每一个Window其实就是一颗View树,Window坐标系如下所示:


图3 AndroidView层次

View树的最根部是ViewRoot,ViewRoot只有一个孩子是DecorView,剩余的ParentView以及ChildView就是我们自己定义的View层,是DecorView的子View。

由于整个View的布局就是一棵树,所以绘制也是按照树形结构遍历来让每个View进行绘制的。ViewRootImp类中的draw()方法准备好Canvas后会调用mView.draw(canvas),其中mView就是调用ViewRootImpl.setView时设置的DecorView。然后就这样从根部到叶子的遍历,父View调用dispatchDraw绘制自己的孩子。

 

七、注意事项

1、硬件加速;在Android 3.0(API Level 11)以上版本,可以通过Hardware Acceleration提高大部分的Canvas绘图效果。同时在设计动画的过程中要注意以下事项:

(1)减少应用程序中View对象的数量

(2)避免过度绘图

(3)不要在onDraw()方法中创建绘制对象

(4)不要经常的编辑形状和位图,以减小资源消耗

2、OpenGL;Android支持OpenGL 1.0、2.0,一般来说框架层Api在性能上低于NDK。使用OpenGL可以获得性能上面的提升,但是OpenGL使用相对复杂,一般都只应用于游戏、或者相对复杂的动画。

 

1 0