android進階(七)-----Android動畫深入分析

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

 

發佈了68 篇原創文章 · 獲贊 17 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章