Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android應用開發之所有動畫使用詳解

Android應用開發之所有動畫使用詳解

編輯:關於Android編程

1 背景

Android系統提供了很多豐富的API去實現UI的2D與3D動畫,最主要的劃分可以分為如下幾類:

View Animation: 視圖動畫在古老的Android版本系統中就已經提供了,只能被用來設置View的動畫。

Drawable Animation: 這種動畫(也叫Frame動畫、幀動畫)其實可以劃分到視圖動畫的類別,專門用來一個一個的顯示Drawable的resources,就像放幻燈片一樣。

Property Animation: 屬性動畫只對Android 3.0(API 11)以上版本的Android系統才有效,這種動畫可以設置給任何Object,包括那些還沒有渲染到屏幕上的對象。這種動畫是可擴展的,可以讓你自定義任何類型和屬性的動畫。

可以看見,當前應用程序開發涉及的主要動畫也就這三大類,我們接下來以類別為基礎來慢慢展開說明。

2 View Animation(視圖動畫)使用詳解

2-1 視圖動畫概述

視圖動畫,也叫Tween(補間)動畫可以在一個視圖容器內執行一系列簡單變換(位置、大小、旋轉、透明度)。譬如,如果你有一個TextView對象,您可以移動、旋轉、縮放、透明度設置其文本,當然,如果它有一個背景圖像,背景圖像會隨著文本變化。

補間動畫通過XML或Android代碼定義,建議使用XML文件定義,因為它更具可讀性、可重用性。

如下是視圖動畫相關的類繼承關系:

這裡寫圖片描述

java類名 xml關鍵宗喎?/kf/yidong/wp/" target="_blank" class="keylink">WPC90aD4NCgk8dGg+DQoJCcPoyvbQxc+iPC90aD4NCgk8L3RyPg0KPC90aGVhZD4NCjx0Ym9keT4NCgk8dHI+DQoJPHRkPkFscGhhQW5pbWF0aW9uPC90ZD4NCgk8dGQ+PGNvZGU+PGFscGhhPiC3xdbD1NpyZXMvYW5pbS/Ev8K8z8I8L2FscGhhPjwvY29kZT48L3RkPg0KCTx0ZD69pbHkzbjD97bItq+7rdCnufs8L3RkPg0KCTwvdHI+DQoJPHRyPg0KCTx0ZD5Sb3RhdGVBbmltYXRpb248L3RkPg0KCTx0ZD48Y29kZT48cm90YXRlPiC3xdbD1NpyZXMvYW5pbS/Ev8K8z8I8L3JvdGF0ZT48L2NvZGU+PC90ZD4NCgk8dGQ+u63D5teq0sbQ/deqtq+7rdCnufs8L3RkPg0KCTwvdHI+DQoJPHRyPg0KCTx0ZD5TY2FsZUFuaW1hdGlvbjwvdGQ+DQoJPHRkPjxjb2RlPjxzY2FsZT4gt8XWw9TacmVzL2FuaW0vxL/CvM/CPC9zY2FsZT48L2NvZGU+PC90ZD4NCgk8dGQ+vaWx5LPftOfJ7Mv1tq+7rdCnufs8L3RkPg0KCTwvdHI+DQoJPHRyPg0KCTx0ZD5UcmFuc2xhdGVBbmltYXRpb248L3RkPg0KCTx0ZD48Y29kZT48dHJhbnNsYXRlPiC3xdbD1NpyZXMvYW5pbS/Ev8K8z8I8L3RyYW5zbGF0ZT48L2NvZGU+PC90ZD4NCgk8dGQ+u63D5tequ7vOu9bD0sa2r7avu63Qp7n7PC90ZD4NCgk8L3RyPg0KCTx0cj4NCgk8dGQ+QW5pbWF0aW9uU2V0PC90ZD4NCgk8dGQ+PGNvZGU+PHNldD4gt8XWw9TacmVzL2FuaW0vxL/CvM/CPC9zZXQ+PC9jb2RlPjwvdGQ+DQoJPHRkPtK7uPaz1tPQxuTL/Lavu63UqsvYYWxwaGGhonNjYWxloaJ0cmFuc2xhdGWhonJvdGF0Zbvy1d/G5Mv8c2V01KrL2LXEyN3G9zwvdGQ+DQoJPC90cj4NCjwvdGJvZHk+DQo8L3RhYmxlPg0KPHA+zai5/cnPzby6zcnPse2/ydLU1rG527XEv7Sz9sC0srm85Lavu621xLnYz7W8sNbWwODBy7DJo6y908/CwLTO0sPHvs3P6s+40ru49tK7uPa1xL3pydzSu8/CuPfW1rK5vOS2r7utoaM8L3A+DQo8aDMgaWQ9"2-2-視圖動畫詳細說明">2-2 視圖動畫詳細說明

可以看出來Animation抽象類是所有補間動畫類的基類,所以基類會提供一些通用的動畫屬性方法,如下我們就來詳細看看這些屬性,關於這些屬性詳細官方解釋翻牆點擊我或者翻牆點擊我。

2-2-1 Animation屬性詳解

xml屬性 java方法 解釋 android:detachWallpaper setDetachWallpaper(boolean) 是否在壁紙上運行 android:duration setDuration(long) 動畫持續時間,毫秒為單位 android:fillAfter setFillAfter(boolean) 控件動畫結束時是否保持動畫最後的狀態 android:fillBefore setFillBefore(boolean) 控件動畫結束時是否還原到開始動畫前的狀態 android:fillEnabled setFillEnabled(boolean) 與android:fillBefore效果相同 android:interpolator setInterpolator(Interpolator) 設定插值器(指定的動畫效果,譬如回彈等) android:repeatCount setRepeatCount(int) 重復次數 android:repeatMode setRepeatMode(int) 重復類型有兩個值,reverse表示倒序回放,restart表示從頭播放 android:startOffset setStartOffset(long) 調用start函數之後等待開始運行的時間,單位為毫秒 android:zAdjustment setZAdjustment(int) 表示被設置動畫的內容運行時在Z軸上的位置(top/bottom/normal),默認為normal


也就是說,無論我們補間動畫的哪一種都已經具備了這種屬性,也都可以設置使用這些屬性中的一個或多個。

那接下來我們就看看每種補間動畫特有的一些屬性說明吧。

2-2-2 Alpha屬性詳解

xml屬性 java方法 解釋 android:fromAlpha AlphaAnimation(float fromAlpha, …) 動畫開始的透明度(0.0到1.0,0.0是全透明,1.0是不透明) android:toAlpha AlphaAnimation(…, float toAlpha) 動畫結束的透明度,同上

2-2-3 Rotate屬性詳解

xml屬性 java方法 解釋 android:fromDegrees RotateAnimation(float fromDegrees, …) 旋轉開始角度,正代表順時針度數,負代表逆時針度數 android:toDegrees RotateAnimation(…, float toDegrees, …) 旋轉結束角度,正代表順時針度數,負代表逆時針度數 android:pivotX RotateAnimation(…, float pivotX, …) 縮放起點X坐標(數值、百分數、百分數p,譬如50表示以當前View左上角坐標加50px為初始點、50%表示以當前View的左上角加上當前View寬高的50%做為初始點、50%p表示以當前View的左上角加上父控件寬高的50%做為初始點) android:pivotY RotateAnimation(…, float pivotY) 縮放起點Y坐標,同上規律

2-2-4 Scale屬性詳解

xml屬性 java方法 解釋 android:fromXScale ScaleAnimation(float fromX, …) 初始X軸縮放比例,1.0表示無變化 android:toXScale ScaleAnimation(…, float toX, …) 結束X軸縮放比例 android:fromYScale ScaleAnimation(…, float fromY, …) 初始Y軸縮放比例 android:toYScale ScaleAnimation(…, float toY, …) 結束Y軸縮放比例 android:pivotX ScaleAnimation(…, float pivotX, …) 縮放起點X軸坐標(數值、百分數、百分數p,譬如50表示以當前View左上角坐標加50px為初始點、50%表示以當前View的左上角加上當前View寬高的50%做為初始點、50%p表示以當前View的左上角加上父控件寬高的50%做為初始點) android:pivotY ScaleAnimation(…, float pivotY) 縮放起點Y軸坐標,同上規律

2-2-5 Translate屬性詳解

xml屬性 java方法 解釋 android:fromXDelta TranslateAnimation(float fromXDelta, …) 起始點X軸坐標(數值、百分數、百分數p,譬如50表示以當前View左上角坐標加50px為初始點、50%表示以當前View的左上角加上當前View寬高的50%做為初始點、50%p表示以當前View的左上角加上父控件寬高的50%做為初始點) android:fromYDelta TranslateAnimation(…, float fromYDelta, …) 起始點Y軸從標,同上規律 android:toXDelta TranslateAnimation(…, float toXDelta, …) 結束點X軸坐標,同上規律 android:toYDelta TranslateAnimation(…, float toYDelta) 結束點Y軸坐標,同上規律

2-2-6 AnimationSet詳解

AnimationSet繼承自Animation,是上面四種的組合容器管理類,沒有自己特有的屬性,他的屬性繼承自Animation,所以特別注意,當我們對set標簽使用Animation的屬性時會對該標簽下的所有子控件都產生影響。

2-3 視圖動畫使用方法

通過上面對於動畫的屬性介紹之後我們來看看在Android中這些動畫如何使用(PS:這裡直接演示xml方式,至於Java方式太簡單了就不說了),如下:


<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_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:pivotY="float" />
    <set>
        ...
    
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
    android:attribute_name="value"
    />
在你的補間動畫文件中引用該文件即可。

可以看見上面第二步修改的是現有插值器的一些屬性,但是有些插值器卻不具備修改屬性,具體如下:

無可自定義的attribute。

android:factor 浮點值,加速速率(默認值為1)。

android:tension 浮點值,起始點後拉的張力數(默認值為2)。

android:tension 浮點值,起始點後拉的張力數(默認值為2)。
android:extraTension 浮點值,拉力的倍數(默認值為1.5)。

無可自定義的attribute。

android:cycles 整形,循環的個數(默認為1)。

android:factor 浮點值,減速的速率(默認為1)。

無可自定義的attribute。

android:tension 浮點值,超出終點後的張力(默認為2)。

再來看看Java自定義插值器的(Java自定義插值器其實是xml自定義的升級,也就是說如果我們修改xml的屬性還不能滿足需求,那就可以選擇通過Java來實現)方式。

可以看見上面所有的Interpolator都實現了Interpolator接口,而Interpolator接口又繼承自TimeInterpolator,TimeInterpolator接口定義了一個float getInterpolation(float input);方法,這個方法是由系統調用的,其中的參數input代表動畫的時間,在0和1之間,也就是開始和結束之間。

如下就是一個動畫始末速率較慢、中間加速的AccelerateDecelerateInterpolator插值器:

public class AccelerateDecelerateInterpolator extends BaseInterpolator
        implements NativeInterpolatorFactory {
    ......
    public float getInterpolation(float input) {
        return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
    }
    ......
}

到此整個補間動畫與補間動畫的插值器都分析完畢了,接下來看下別的動畫。

3 Drawable Animation(Drawable動畫)使用詳解

3-1 Drawable動畫概述

Drawable動畫其實就是Frame動畫(幀動畫),它允許你實現像播放幻燈片一樣的效果,這種動畫的實質其實是Drawable,所以這種動畫的XML定義方式文件一般放在res/drawable/目錄下。具體關於幀動畫的xml使用方式翻牆點擊我查看,java方式翻牆點擊我查看。

如下圖就是幀動畫的源碼文件:

這裡寫圖片描述

可以看見實際的真實父類就是Drawable。

3-2 Drawable動畫詳細說明

我們依舊可以使用xml或者java方式實現幀動畫。但是依舊推薦使用xml,具體如下:

必須是根節點,包含一個或者多個元素,屬性有:

android:oneshot true代表只執行一次,false循環執行。 類似一幀的動畫資源。

animation-list的子項,包含屬性如下:

android:drawable 一個frame的Drawable資源。android:duration 一個frame顯示多長時間。

3-3 Drawable動畫實例演示

關於幀動畫相對來說比較簡單,這裡給出一個常規使用框架,如下:



<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource_name"
        android:duration="integer" />