Android动画可以分为三种:View动画,帧动画和属性动画;属性动画为API11的新特性,在低版本是无法直接使用属性动画的。
本章主要学习内容:
-
1.View动画以及自定义View动画
-
2.View动画的一些特殊使用场景
-
3.对属性动画做了一个全面的介绍
-
4.使用动画的一些注意事项
7.1View动画
- 1.View动画的四种变换效果对应着Animation的四个子类:TranslateAnimation(平移动画)、ScaleAnimation(缩放动画)、RotateAnimation(旋转动画)和AlphaAnimation(透明度动画),他们既可以用代码创建也可以用XML来定义,推荐使用可读性更好的XML来定义
- 2.标签标示动画集合,对应AnimationSet类,他可以包含若干个动画,并且他的内部也可以嵌套其他动画集合。android:interpolator标示动画集合所采用的差值器,差值器影响动画速度,比如非匀速动画就需要通过差值器来控制动画的播放过程。android:shareInterpolator表示集合中的动画是否和集合共享同一个差值器,如果集合不指定差值器,那么自动化就需要单独制定所需要的差值器或者默认值。
- 3.Animation通过setAnimationListener方法可以给View动画添加过程监听
- 4.自定义View动画只需要继承Animation这个抽象类,并重写initialize和applyTransformation方法,在initialize方法中做一些初始化工作,在applyTransformation中进行相应的矩阵变换,很多时候需要采用Camera来简化矩阵变换过程。
- 5帧动画是顺序播放一组预先定义好的图片,类似电影播放;使用简单但容易引发OOM,尽量避免使用过多尺寸较大的图片。
7.2View动画的特殊使用场景
- 1.LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,当它的子元素出场的时候都会具有这种动画,ListView上用的多,LayoutAnimation也是一个View动画。
- 2.Activity/Fragment的切换效果 在startActivity(Intent)或finish()之后调用overridePendingTransition(int enterAnim,int exitAnim)方法。 Fragment也可以添加切换效果,通过FragmentTransaction中的setCustomAnimations()方法来添加;需要考虑兼容性使用View动画,属性动画是API11新引入的。
7.3属性动画
AnimatorSet、ObjectAnimator、TimeAnimator、ValueAnimator
-
1.属性动画可以对任意对象的属性进行动画而不仅仅是View,动画默认间隔300ms,默认帧率10ms/帧。在一个时间间隔内完成对象从一个属性值到另一个属性值的改变。
-
2.android:propertyName表示属性动画的作用的属性的名称。*
android:duration表示动画的时长
android:valueFrom表示动画的起始值
android:valueTo表示属性的结束值
android:startOffset表示动画的延迟时间,当动画开始后,需要延迟多少毫秒才会真正播放次动画。
android:repeatCount表示动画的重复次数(默认为0,其中-1表示无限循环)
android:repeatMode表示动画的重复模式(repeat和reverse可选,表示连续重复和逆向重复)
android:valueType表示android:propertyName所指定的属性的类型,可选intType/floatType。如果android:propertyName指定的属性表示颜色,则不需要指定该属性。
7.3.2理解差值器和估值器
-
1.时间差值器(TimeInterpolator)的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统预置的有LinearIn特rpolator(线性插值器:匀速动画),AcceletateDecelerateInterpolator(加速减速差值器:动画两头慢中奖快),DecelerateInterpolator(减速差值器:动画越来越慢)
-
2.估值器(TypeEvaluator)的作用是根据当前属性改变的百分比来计算改变后属性值。系统预置有IntEvaluator,FloatEvaluator,ArabEvaluator
-
3.差值器和估值器除了系统提供之外,我们还可以自定义。自定义差值器需要实现Interpolator或者TimeInterpolator;自定义估值器算法需要实现TypeEvaluator
7.3.4对任意属性做动画
-
1.属性动画要求作用的对象提供该属性的get和set方法,缺一不可
-
2.如果你的对象没有对应的get和set方法
-
请给你的对象加上get和set方法,如果你有权限的haul(如果直接使用系统的类,是无法加上的)
-
用一个类来包装原始对象,简介为期提供get和set方法
-
采用ValueAnimator,监听动画过程,自己实现属性的改变
-
7.3.5属性动画的工作原理
通过反射调用get/set方法;属性动画需要运行在有Looper的线程中。
7.4使用动画的注意事项
- 1.使用帧动画时,当图数量较多且图片分辨率较大的时候容易出现OOM,需注意,尽量避免使用帧动画
- 2.使用无限循环动画的时候,在Activity退出时及时停止,否则将导致Activity无法释放从而造成内存泄漏
- 3.View动画View的影像做动画,并不是真正的改变了View的状态,因此有时会出现动画完成后View无法隐藏(setVisibility(View.Gone)失效),这时候调用view.clearAnimation()清理View动画即可解决
- 4.不要使用px,使用px会导致不同设备上有不同的效果
- 5.View动画是对View的影像做动画,View的真实位置没有变动,也就导致点击View动画后的位置触摸事件不会响应,属性动画不存在这个问题
- 6.使用动画的过程中,使用硬件加速可以提高动画的流畅度
- 7.动画在3.0以下的系统存在兼容性问题,特殊场景可能无法正常工作,需要做好适配工作。