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、硬件加速:使用動畫過程中,建議開啓硬件加速,提升動畫流暢性