本文共 4853 字,大约阅读时间需要 16 分钟。
4.0.0.1 Android中有哪几种类型的动画,属性动画和补间动画有何区别?
-
常见三类动画
- View动画(View Animation)/补间动画(Tween animation):对View进行平移、缩放、旋转和透明度变化的动画,不能真正的改变view的位置。应用如布局动画、Activity切换动画
- 逐帧动画(Drawable Animation):是View动画的一种,它会按照顺序播放一组预先定义好的图片
- 属性动画(Property Animation):对该类对象进行动画操作,真正改变了对象的属性
-
属性动画和补间动画区别
- 属性动画才是真正的实现了view的移动,补间动画对view的移动更像是在不同地方绘制了一个影子,实际对象还是处于原来的地方。当动画的repeatCount设置为无限循环时,如果在Activity退出时没有及时将动画停止,属性动画会导致Activity 无法释放而导致内存泄漏,而补间动画却没问题。xml文件实现的补间动画,复用率极高。在 Activity切换,窗口弹出时等情景中有着很好的效果。
- 补间动画还有一个致命的缺陷,就是它只是改变了View的显示效果而已,而不会真正去改变View的属性。什么意思呢?比如说,现在屏幕的左上角有一个按钮,然后我们通过补间动画将它移动到了屏幕的右下角,现在你可以去尝试点击一下这个按钮,点击事件是绝对不会触发的,因为实际上这个按钮还是停留在屏幕的左上角,只不过补间动画将这个按钮绘制到了屏幕的右下角而已。下面这张图摘自网络!
-
补间动画和帧动画xml文件存放的位置
- 补间动画是放置到res/anim/下面
- 帧动画是放置到res/drawable/下面,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长
-
补间动画和属性动画常用的有哪些?
- View动画框架是旧的框架,只能用于Views。比较容易设置和能满足许多应用程序的需要。View动画框架中一共提供了AlphaAnimation(透明度动画)、RotateAnimation(旋转动画)、ScaleAnimation(缩放动画)、TranslateAnimation(平移动画)四种类型的补间动画;并且View动画框架还提供了动画集合类(AnimationSet),通过动画集合类(AnimationSet)可以将多个补间动画以组合的形式显示出来。
- 与属性动画相比View动画存在一个缺陷,View动画改变的只是View的显示,而没有改变View的响应区域,并且View动画只能对View做四种类型的补间动画。因此Google在Android3.0(API级别11)及其后续版本中添加了属性动画框架,从名称中就可以知道只要某个类具有属性(即该类含有某个字段的set和get方法),那么属性动画框架就可以对该类的对象进行动画操作(其实就是通过反射技术来获取和执行属性的get,set方法),同样属性动画框架还提供了动画集合类(AnimatorSet),通过动画集合类(AnimatorSet)可以将多个属性动画以组合的形式显示出来。
4.0.0.2 View动画为何不能真正改变View的位置?而属性动画为何可以?属性动画是如何改变View的属性?
4.0.0.3 补间动画是如何作用于view的,从源码角度分析以下?为何说补间动画没有改变View的属性?
-
关于补间动画原理
- 要了解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 的画布坐标系来实现的
-
如何计算补间动画数据
4.0.0.6 属性动画插值器和估值器的作用?插值器和估值器分别是如何更改动画的?
4.0.0.7 使用动画会出现哪些问题?动画占用大量内存,如何优化?使用动画的注意事项有哪些?
-
使用动画会出现哪些问题?
- OOM问题:这个问题主要出现在帧动画中,当图片数量较多且图片较大时就极易出现OOM,这个在实际开发中要尤其注意,尽量避免使用帧动画。
- 内存泄露:在属性动画中有一类无限循环的动画,这类动画需要在Activity退出时及时停止,否则将导致Activity无法释放从而造成内存泄露,通过验证后发现View动画并不存在此问题。
- 动画占用大量内存,如何优化?
-
使用动画的注意事项有哪些?
- OOM问题:这个问题主要出现在帧动画中,当图片数量较多且图片较大时就极易出现OOM,这个在实际开发中要尤其注意,尽量避免使用帧动画。
- 内存泄露:在属性动画中有一类无限循环的动画,这类动画需要在Activity退出时及时停止,否则将导致Activity无法释放从而造成内存泄露,通过验证后发现View动画并不存在此问题。
- 兼容性问题:动画在3.0以下的系统有兼容性问题,在某些特殊场景可能无法正常工作,因此要做好适配工作。
- View动画的问题:View动画是对View的影像做动画,并不是真正改变View的状态,因此有时候会出现动画完成后View无法隐藏的现象,即setVisibility(View.GOEN)失效了,这个时候只要调用view.clearAnimation()清除View动画即可解决问题。
- 不要使用px:在进行动画的过程中,要尽量使用dp,使用px会导致在不用的设备上有不用的效果。
- 动画元素的交互:从3.0开始,将view移动(平移)后,属性动画的单击事件触发位置为移动后的位置,但是View动画仍然在原位置。在Android3.0以前的系统中,不管是View动画还是属性动画,新位置都无法触发单击事件同时,老位置仍然能触发单击事件(因为属性动画在Android3.0以前是没有的,是通过兼容包实现的,底层也是调用View动画)。
- 硬件加速:使用动画的过程中,建议开启硬件加速,这样会提高动画的流畅性。
- 开启方法:
- 在你的Android manifest文件,添加hardwareAccelerated属性就可以了。可以给整个application添加,也可以单独给一个acitivty添加,该属性默认值为false;
转载地址:http://cytla.baihongyu.com/