7.Android动画深入分析
Android动画可以分为三种:View动画,帧动画和属性动画。
View动画的作用对象是View,它支持4种动画效果,分别是平移动画、缩放动画、旋转动画和透明度动画。View动画的四种变换效果对应着Animation的四个子类:TranslateAnimation、ScaleAnimation、RotateAnimation和AlphaAnimation。
<translate>
,<scale>
,<rotate>
,<alpha>
,<set>
除了系统提供的四种View动画外,我们还可以自定义View动画。派生一种新动画只需要继承Animation这个抽象类,然后重写它的initialize和applyTransformation方法,在initialize方法中做一些初始化工作,在applyTransformation中进行相应的矩阵变换极客,很多时候需要采用Camera来简化矩阵变换的过程。
<animation-list>
AnimationDrawable使用帧动画。
LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这种动画效果。
<layoutAnimation
xmlns:android="..."
android:delay="0.5"
android:animationOrder="normal"
android:animation="@anim/anim_item" />
除了在xml中为ViewGroup指定android:layoutAnimation
属性外,还可以通过LayoutAnimationController来实现。
Activity有默认的切换效果,但是这个效果我们是可以自定义的,主要用到overridePendingTransition(int enterAnim,int exitAnim)
这个方法,这个方法必须在startActivity(Intent)
或者finish()
之后被调用才能生效。
Fragment也可以添加切换动画,可以通过FragmentTransaction
中的setCustomAnimations()
方法来添加切换动画。
TimeInterpolator时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统预置的有LinearInterpolater
,AccelerateDecelerateInterpolator
,DecelerateInterpolator
。TypeEvaluator类型估值算法,也叫估值器,它的作用是根据当前属性改变的百分比来计算改变后的属性值,系统预置的有IntEvaluator,FloatEvaluator和ArgbEvaluator。
属性动画要求对象的该属性有set/get方法。
属性动画提供了监听器用于监听动画的播放过程,主要由如下两个接口:AnimatorUpdateListener和AnimatorListener。
使用动画的注意事项:
- OOM问题,帧动画
- 内存泄漏,在属性动画中有一类无限循环的动画,这类动画需要在Activity退出时及时停止,否则将导致Activiity无法释放从而造成内存泄漏,View动画不存在这类问题。
- 兼容性问题,动画在3.0以下的系统上有兼容性问题
- View动画的问题,View动画是对View的影像做动画,并不是真正地改变View的状态,因此有时候会出现动画完成后View无法隐藏的现象,即setVisibility(View.GONE)失效了,这个时候只要调用
view.clearAnimation()
清除View动画即可解决此问题。 - 不要使用px
- 动画元素的交互,从Android 3.0,属性动画的单击事件触发位置为移动后的位置,但是View动画仍然在原位置。
- 硬件加速,使用动画的过程中,建议开启硬件加速,这样会提高动画的流畅性。