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使用相对复杂,一般都只应用于游戏、或者相对复杂的动画。
- Android动画--视图动画
- Android动画--属性动画
- android动画 -- 属性动画
- Android:动画:tween动画
- Android:动画:Frame动画
- Android动画动画二
- Android动画-属性动画
- Android动画【属性动画】
- Android动画-帧动画
- Android动画--帧动画
- Android动画--属性动画
- Android动画-View动画
- android 动画 -- tween动画
- android 动画
- android动画
- android动画
- android动画
- Android动画
- 源码-JavaScript&jQuery交互式前端开发-第2章-JavaScript基础指令-使用变量来存储布尔值
- Spring Scope与Lazy
- stm32 使用malloc申请内存和free释放内存造成的内存碎片测试
- 重写ViewPager,禁止其左右滑动
- 找规律,数学(巨大的斐波那契数列,uva 11582)
- Android动画
- JSON与JSONP的区别于实现
- 数组三种实现方式
- unity shader编写(一),漫反射shader实现
- angular1 之 动画篇
- HDU-2054A == B ?
- 折腾树莓派(五)使用aria2搭建下载服务器
- HDU 1009
- js返回顶部的封装