android动画分三种:补间动画、帧动画和属性动画。
下面我们一一说明
一、补间动画:
支持四种动画效果,分别是位移动画(TranslateAnimation)、缩放动画(ScaleAnimation)、旋转动画(RotateAnimation)和透明度动画(AlphaAnimation)。这四种动画既可以通过XML来定义,也可以通过代码动态创建,建议使用XML定义。
示例代码:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package]anim/test_resource"
android:shareInterpolator=["true"|"false"]>
<alpha
android:fromAlpha="float"
android:toAlpha="float"/>
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float"/>
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float"/>
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pcvotY="float"/>
<set>
<alpha
android:fromAlpha="float"
android:toAlpha="float"/>
</set>
</set>
从上面例子可以看出,补间动画既可以是单个动画,也可以由一系列动画组合而成。
1、<set>表示动画集合,对应java AnimationSet类,可以包含多个动画,并且可以嵌套其他动画集合。
android:interpolator:差值器,差值器影响动画的速度
android:shareInterpolator:集合中的动画是否和集合共享同一个差值器。如果集合不指定差值器,那么子动画就需要单独制定差值器或使用默认值
2、<translate>平移动画,对应java TranslateAnimation类,可以使一个View在水平或竖直方向完成平移的动画
android:fromXDelta:x的起始值
android:toXDelta::x的结束值
android:fromYDelta:y的起始值
android:toYDelta:y的结束值
3、<scale>缩放动画,对应java ScaleAnimation,可以使View方法或缩小的动画
android:fromXScale:水平方向缩放的起始值
android:toXScale:水平方向缩放的结束值
android:fromYScale:竖直方向缩放的起始值
android:toYScale:竖直方向缩放的结束值
android:pivotX:缩放的轴点X坐标,影响缩放效果
android:pivotY:缩放的轴点Y坐标,影响缩放效果
4、<rotate>旋转动画,对应java RotateAnimation,使View旋转的动画
android:fromDegrees:旋转开始的角度
android:toDegrees:旋转结束的角度
android:pivotX:旋转的轴点X坐标
android:pivotY:旋转的轴点Y坐标
5、<alpha>透明度动画,对应java AlphaAnimationo,可以改变View透明度
android:fromAlpha:透明度的起始值
android:toAlpha:透明度的结束值
android:duration:动画持续时间
android:fillAfter:动画结束以后View是否停留在结束位置
二、帧动画
帧动画是顺序播放一组预先定义号的图片,类似于视频播放
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/image1" android:duration="100"/>
<item android:drawable="@drawable/image2" android:duration="100"/>
<item android:drawable="@drawable/image3" android:duration="100"/>
</animation-list>
帧动画容易引起OOM,使用帧动画应尽量避免使用尺寸较大的图片
三、属性动画
1、属性动画是API 11新加入的特性,可以对任何对象的属性进行动画,默认时间间隔300ms。
常用的几个动画类是:ValueAnimator、ObjectAnimator、AnimatorSet。其中ObjectAnimator继承自ValueAnimator,AnimatorSet是动画集合。
(1)改变一个对象的translationY属性
ObjectAnimator.ofFloat(myObject,"translationY",-myObject.getHeight()).start()
(2)改变一个对象的背景色:在3秒内从0xFFFF8080到0xFF8080FF渐变
ValueAnimator colorAnim = objectAnimator.ofInt(this,"backgroundColor",0xFFFF8080,0xFF8080FF)
colorAnim.setDuration(3000);
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setRepeatCount(ValueAnimator.INFINITE);
colorAnim.setRepeatMode(ValueAnimator.REVERSE);
colorAnim.start();
(3)动画集合,5秒内对View的旋转、平移、缩放和透明度发送改变
AnimatorSet set = new AnimatorSet();
set.playTogether{
ObjectAnimator.ofFloat(myView,"rotationX",0,360),
ObjectAnimator.ofFloat(myView,"rotationY",0,180),
ObjectAnimator.ofFloat(myView,"rotation",0,-90),
ObjectAnimator.ofFloat(myView,"translationX",0,90),
ObjectAnimator.ofFloat(myView,"translationY",0,90),
ObjectAnimator.ofFloat(myView,"scaleX",1,1.5f),
ObjectAnimator.ofFloat(myView,"scaleY",1,0.5f),
ObjectAnimator.ofFloat(myView,"alpha",1,0.25f,1),
}
set.setDuration(5000).start();
2、差值器和估值器
(1)TimeInterpolator时间差值器:作用是根据时间流逝的百分比来计算当前属性值改变的百分比,系统预置的有LinearInterpolator(线性差值器:匀速动画)、AccelerateDecelerateInterpolator(加减速差值器:动画两头慢中间快)和DecelerateInterpolator(减速差值器:动画越来越慢)
(2)TypeEvaluator估值器:作用是根据当前属性改变的百分比计算改变后的属性值,系统预置的有IntEvaluator(整型属性)、FloatEvaluator(浮点型属性)和ArgbEvaluator(Color属性)
3、属性动画的监听器
属性动画提供了监听器用于监听动画的播放过程,主要有两个接口:AnimatorUpdateListener和AnimatorListener
AnimatorListener可以监听动画的开始、结束、取消和重复播放
AnimatorUpdateListener可以监听动画的整个过程,动画由很多帧组成,没播放一帧,onAnimationUpdate就会被调用一次。
四、补间动画的特殊使用场景
补间动画除了以上四种形式,还可以在一些特殊的场景下使用,如ViewGroup控制子元素出场效果、Activity切换效果
1、LayoutAnimation:作用于ViewGroup,为ViewGroup指定一个动画,子元素出场时都会具有这种动画
代码实例:
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="normal"
android:animation="@anim/item">
delay:表示子元素开始动画的时间延迟
animationOrder:表示子元素动画的顺序,有三种选项:normal(顺序显式)、reverse(逆序显式)和random(随机显式)
2、Activity的切换效果
Activity有默认的切换效果,也可以自定义。主要用到overridePendingTransition(int enterAnim, int exitAnim)方法,这个方法必须在startActivity(Intent)或finish()之后被调用才生效。
enterAnim:当Activity被打开时需要的动画资源id
exitAnim:当Activity被暂停时,所需的动画资源id
五、动画的使用注意事项
1、OOM:主要出现在帧动画中,当图片数量多且大的时候很容易出现OOM,尽量避免使用帧动画
2、内存泄漏:属性动画中有一类无限循环的动画,需要在Activity退出时及时停止,否则将导致Activity无法释放而造成内存泄漏
3、兼容性问题:动画在3.0以下系统有兼容性问题
4、补间动画的问题:补间动画是对View的映像做动画,并没有改变View的状态,有时候会出现动画完成后View无法隐藏的现象,这个时候调用view.clearAnimation()清除View动画即可
5、不要使用PX:使用动画过程中,尽量使用dp,否则会导致在不同设备上有不同的效果
6、硬件加速:使用动画过程中,建议开启硬件加速,提升动画流畅性