Android四大檢視動畫圖文詳解

孫群發表於2015-12-03

Android中的動畫分為檢視動畫(View Animation)、屬性動畫(Property Animation)以及Drawable動畫。本文主要講解檢視動畫,如果想了解屬性動畫,可參見博文《Android圖文詳解屬性動畫》

Android從最初的版本就支援檢視動畫,檢視動畫顧名思義,就是應用在檢視View上的動畫。檢視動畫的核心類是android/view/animation/Animation,該類是一個抽象類,該類有五個子類,分別是AlphaAnimation、TranslateAnimation、RotateAnimation、ScaleAnimation、AnimationSet。AlphaAnimation可以讓View實現透明度漸變效果,TranslateAnimation可以讓View實現平移動畫效果,RotateAnimation可以讓View實現旋轉動畫效果,ScaleAnimation可以讓View實現伸縮動畫效果,AnimationSet可以讓將多個檢視動畫組合起來應用到某個View上,從而實現複雜的動畫效果。動畫既可以用程式碼實現,也可以用XML檔案定義動畫。

本文下面的示例程式碼都是對一個TextView進行的操作,對應的layout檔案如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.ispring.viewanimation.AnimationActivity">

    <TextView android:id="@+id/textView"
        android:text="@string/hello_world"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:background="#8bc5ba"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:onClick="onClick"
        android:text="開始"
        />

</RelativeLayout>

說明:下文會涉及各種座標系,這裡先提一個基礎知識,下面提及的各種座標系的都是X正半軸水平向右,Y軸正半軸垂直向下的。


AlphaAnimation

AlphaAnimation可以讓View實現透明度漸變效果。其使用方法如下所示:

//1.0表示完全不透明,0.0表示完全透明
float fromAlpha = 1.0f;
float toAlpha = 0.0f;
//1.0 => 0.0表示View從完全不透明漸變到完全透明
Animation animation = new AlphaAnimation(fromAlpha, toAlpha);
//設定動畫持續時間為3000毫秒
animation.setDuration(3000);
//通過View的startAnimation方法將動畫立即應用到View上
textView.startAnimation(animation);

介面如下所示:
這裡寫圖片描述

下面對以上程式碼進行一下解釋:

AlphaAnimation的建構函式方法簽名是

public AlphaAnimation (float fromAlpha, float toAlpha)
  • fromAlpha表示動畫開始時View的透明度alpha值,toAlpha表示動畫結束時View的透明度alpha值。在以上程式碼中,我們將fromAlpha設定為1.0,表示動畫開始時TextView完全不透明,即完全可見;將toAlpha設定為0.0,表示動畫結束時TextView完全透明,即完全不可見。這就實現了TextView從完全可見到完全不可見的透明度漸變效果。

  • 我們還要通過Animation的setDuration方法設定動畫的持續時間,單位為毫秒,我們在上面的程式碼中設定的是3000毫秒,即動畫持續三秒。

  • 最後我們呼叫View的startAnimation方法將動畫繫結到TextView上並立即開始動畫效果。

由此我們可見,使用檢視動畫其實比較簡單,基本流程是:

  1. 建立Animation某個子類的例項
  2. 通過Animation的setDuration方法設定動畫持續時間
  3. 最後通過View的startAnimation方法啟動動畫

在使用其他檢視動畫時流程跟上面基本一致,只是最開始動畫的建構函式傳入的引數不同而已。

之前提到,除了可以用程式碼建立動畫外,還可以用XML檔案定義動畫,我們可以用下面的XML檔案定義上述動畫:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="1.0"
    android:toAlpha="0.0" 
    android:duration="3000"
    />

定義檢視動畫的XML檔案是放在res/anim資料夾下的,此處我設定動畫的檔名是alpha.xml,如下圖所示:

這裡寫圖片描述

然後我們可以通過AnimationUtils.loadAnimation()方法根據XML資原始檔得到一個Animation物件,如下所示:

Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha);
textView.startAnimation(animation);

當我們需要更改動畫效果的引數的時候,我們只需要更新動畫XML檔案即可,無需更改程式碼,所以用XML檔案定義動畫比用程式碼生成一個動畫物件可維護性更好一些。但是有些情況下,我們建立動畫的引數可能是在執行時才動態決定的,那這樣就無法用XML定義動畫了,只能用程式碼建立動畫物件。在後面的文章中,大部分動畫都給出了對應的XML檔案定義。


TranslateAnimation

TranslateAnimation可以讓View實現平移動畫效果。
TranslateAnimation有兩個常用的建構函式,分別是:

public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

public TranslateAnimation (int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)

我們分別研究一下這兩個建構函式。

  • public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
    該建構函式的使用方法如下所示:

    int fromXDelta = 0;
    int toXDelta = getResources().getDisplayMetrics().widthPixels / 2;
    int fromYDelta = 0;
    int toYDelta = 0;
    //讓動畫在水平位置上沿X軸平移toXDelta個畫素
    Animation animation = new TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
    //設定動畫持續時間為3000毫秒
    animation.setDuration(3000);
    //通過View的startAnimation方法將動畫立即應用到View上
    textView.startAnimation(animation);

    介面如下所示:
    這裡寫圖片描述

    下面對以上程式碼進行一下說明:

    • fromXDelta 表示動畫開始時View相對於原來位置X軸方向的偏移座標

    • toXDelta 表示動畫結束時View相對於原來位置X軸方向的偏移座標

    • fromYDelta 表示動畫開始時View相對於原來位置Y軸方向的偏移座標

    • toYDelta 表示動畫結束時View相對於原來位置Y軸方向的偏移座標

    也就是說,建構函式裡面的這四個delta分量都是相對於View原來位置的相對座標偏移分量,這裡所說的“View原來位置”指的是View在動畫開始前的初始位置。我們在示例中fromYDelta和toYDelta 都設定為0,表示TextView不會在Y軸方向上平移。fromXDelta 設定為0表示動畫開始時,TextView的X座標與初始的X座標一致。toXDelta 表示了TextView向右偏移的距離。

    實際上,對該建構函式,Android沒有提供對應的XML檔案定義,但是下面的建構函式有相應的XML檔案定義。

  • public TranslateAnimation (int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
    該建構函式相比於之前的建構函式來說更加靈活,使用方法如下所示:

    //設定fromX
    int fromXType = Animation.ABSOLUTE;
    float fromXValue = textView.getX();
    //設定toX
    int toXType = Animation.RELATIVE_TO_PARENT;
    float toXValue = 0.5f;
    //設定fromY
    int fromYType = Animation.ABSOLUTE;
    float fromYValue = textView.getY();
    //設定toY
    int toYType = Animation.RELATIVE_TO_SELF;
    float toYValue = 3.0f;
    //建立動畫
    Animation animation = new TranslateAnimation(
            fromXType, fromXValue,
            toXType, toXValue,
            fromYType, fromYValue,
            toYType, toYValue);
    //設定動畫持續時間為3000毫秒
    animation.setDuration(3000);
    //通過View的startAnimation方法將動畫立即應用到View上
    textView.startAnimation(animation);

    介面如下所示:
    這裡寫圖片描述

    下面對以上程式碼進行說明:

    該建構函式有八個引數,其中可以分為四組,(fromXType、fromXValue)決定了動畫開始時View的X座標,(toXType、toXValue)決定了動畫結束時View的X座標,(fromYType、fromYValue)決定了動畫開始時View的Y座標,(toYType、toYValue)決定了動畫結束時View的Y座標。這四組引數就完整地定義了平移動畫開始和結束時View的座標位置。

    由於這四組引數引數取值類似,所以我們主要研究其中一組即可,我們以fromXType和fromXValue進行說明,fromXType的取值型別決定了如何設定fromXValue的值。fromXType的取值有三種,分別是:ABSOLUTE、RELATIVE_TO_PARENT和RELATIVE_TO_SELF。

    • ABSOLUTE
      當fromXType取值為ABSOLUTE時,表示fromXValue的值是在該View的父控制元件的座標系的絕對值,比如fromXValue為200,表示動畫開始時,View的左側到其父控制元件左側的距離是200個畫素。

    • RELATIVE_TO_PARENT
      當fromXType取值為RELATIVE_TO_PARENT時,表示fromXValue的值是相對於其父控制元件尺寸的百分比。比如fromXValue為0,表示動畫開始時,View的左側緊靠父控制元件的左側;fromXValue為0.5時,表示動畫開始時,View的左側位置在父控制元件水平方向中間的位置;fromXValue為1時,表示動畫開始時,View的左側位置與父控制元件的右側位置完全重合。

    • RELATIVE_TO_SELF
      當fromXType取值為RELATIVE_TO_SELF時,表示fromXValue的值是相對於其自身尺寸的百分比。比如fromXValue為0,表示動畫開始時,View的X座標和初始位置的X座標相同;fromXValue為0.5時,表示動畫開始時,View的左側位置在初始View狀態下水平方向中間的位置,即向右偏移了View寬度的一半;fromXValue為1時,表示動畫開始時,View的左側位置正好與初始View狀態下的右側位置重合,即向右偏移了正好View的寬度大小的距離。

    有了以上理論基礎,我們再看一下我們上面的程式碼。

    • 設定fromX

      int fromXType = Animation.ABSOLUTE;
      float fromXValue = textView.getX();

      我們將fromXType設定為ABSOLUTE,然後將fromXValue的值設定為textView.getX(),這樣的意義是動畫開始時,TextView的X座標與TextView初始狀態下X座標相同。

    • 設定toX

      int toXType = Animation.RELATIVE_TO_PARENT;
      float toXValue = 0.5f;

      我們將toXType設定為RELATIVE_TO_PARENT,將toXValue設定為0.5,表示動畫結束時,TextView的左側將會處於其父控制元件RelativeLayout的水平中間位置。

    • 設定fromY

      int fromYType = Animation.ABSOLUTE;
      float fromYValue = textView.getY();

      將fromYType設定為ABSOLUTE,將fromYValue設定為textView.getY(),這樣的意義是動畫開始時,TextView的Y座標與TextView初始狀態下Y座標相同。

    • 設定toY

      int toYType = Animation.RELATIVE_TO_SELF;
      float toYValue = 3.0f;

      我們將toYType設定為RELATIVE_TO_SELF,將toYValue設定為為3,表示當動畫結束時,TextView的Y座標將變成其高度的三倍。

    我們設定的fromX和toX兩組引數會使得TextView在X水平方向上向右滑動;fromY和toY兩組引數會使得TextView在Y垂直方向上向下滑動,大家可以仔細觀看上面的動態圖理解一下。

    上述動畫對應的XML檔案如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromXDelta="0"
        android:toXDelta="50%p"
        android:fromYDelta="0"
        android:toYDelta="300%"
        android:duration="3000"
    />

    以上XML檔案中fromXDelta、toXDelta、fromYDelta、toYDelta四個引數都是float型別的引數,這幾個值可以以%結尾,也可以以%p結尾,也可以沒有其他額外結尾。

    1. 無結尾
      fromXDelta和fromYDelta都只是一個簡單的float值,沒有其他額外的結尾,這樣的值表示的意思是該值對應的型別是Animation.ABSOLUTE,即表示的絕對值,即android:fromXDelta="0"與以下程式碼等價:

      int fromXType = Animation.ABSOLUTE; 
      float fromXValue = 0
    2. 以%p結尾
      toXDelta的值是50%p,以%p結尾,此處的p是Parent的縮寫,說明值的型別是Animation.RELATIVE_TO_PARENT,即該值表示相對於其父控制元件寬度的50%,android:toXDelta="50%p"等價於以下程式碼:

      int toXType = Animation.RELATIVE_TO_PARENT;
      float toXValue = 0.5f;
    3. 以%結尾
      toYDelta的值是300%,以%結尾,此處的%是相對於控制元件自身的,即值對應的型別是Animation.RELATIVE_TO_SELF,android:toYDelta="300%"等價於以下程式碼:

      int toYType = Animation.RELATIVE_TO_SELF;
      float toYValue = 3.0f;

RotateAnimation

RotateAnimation可以讓View在XY平面內實現旋轉動畫效果。
RotateAnimation有三個常用的建構函式,分別是:

public RotateAnimation (float fromDegrees, float toDegrees)

public RotateAnimation (float fromDegrees, float toDegrees, float pivotX, float pivotY)

public RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

旋轉動畫需要兩種型別的引數:動畫的旋轉軸以及動畫的旋轉角度。RotateAnimation的三個建構函式的主要區別在於確定動畫旋轉軸的引數不同,我們具體看一下。

  • public RotateAnimation (float fromDegrees, float toDegrees)
    該建構函式只需要傳入動畫開始時的旋轉角度以及動畫結束時的旋轉角度即可,toDegrees與fromDegrees的差值即旋轉過的角度,不需要額外傳入引數設定旋轉軸。這種情況下,動畫的旋轉軸就是View的左上角點。該建構函式使用方法如下所示:

    //以View左上角為旋轉軸,建立旋轉60度的動畫
    Animation animation = new RotateAnimation(0, 60);
    //設定動畫持續時間
    animation.setDuration(3000);
    //通過View的startAnimation方法將動畫立即應用到View上
    textView.startAnimation(animation);

    介面如下所示:

    這裡寫圖片描述

    我們看到,TextView以其左上角點為旋轉軸沿著順時針方向旋轉了60度。

    上述動畫對應的XML檔案如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromDegrees="0"
        android:toDegrees="60"
        android:duration="3000"
    />
  • public RotateAnimation (float fromDegrees, float toDegrees, float pivotX, float pivotY)
    很多情況下用View的左上角點作為旋轉軸不能滿足實際需求,那麼我們就可以利用該建構函式傳入旋轉軸的位置座標(pivotX,pivotY)。需要說明的是,此處的座標(pivotX,pivotY)指的是View自身的區域性座標系中的座標。所謂的View自身的區域性座標系就是以View自身的左上角為座標原點的座標系。該建構函式的使用方法如下所示:

    //以View中心點作為旋轉軸,建立旋轉60度的動畫
    float pivotX = textView.getWidth() / 2;
    float pivotY = textView.getHeight() / 2;
    Animation animation = new RotateAnimation(0, 90, pivotX, pivotY);
    //設定動畫持續時間
    animation.setDuration(3000);
    //通過View的startAnimation方法將動畫立即應用到View上
    textView.startAnimation(animation);

    介面如下所示:
    這裡寫圖片描述

    在上面的程式碼中,我們將TextView長度的一半作為旋轉軸的pivotX,將TextView高度的一半作為旋轉軸的pivotY,這樣TextView就以自身的中心點作為旋轉軸順時針旋轉了90度。

    假設TextView的getWidth()和getHeight()返回的寬度、高度分別是是200畫素和100畫素,那麼上述動畫對應的XML檔案如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromDegrees="0"
        android:toDegrees="90"
        android:pivotX="100"
        android:pivotY="50"
        android:duration="3000"
    />

    此處XML檔案中pivotX和pivotY的取值規則與之前提到的Translate動畫的XML檔案中fromXDelta等引數的取值規則相同。此處XML檔案中pivotX和pivotY的取值都是簡單的float型別,表示該值的型別是Animation.ABSOLUTE。 其實此處如果將pivotX和pivotY的值都設定為50%也能達到以TextView中心點旋轉的目的,以%結尾表示值的型別是Animation.RELATIVE_TO_SELF,50%表示相對於TextView自身的中心點。

  • public RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

    該建構函式是最靈活的一種方式。pivotXType和pivotYType可取值ABSOLUTE或RELATIVE_TO_SELF或RELATIVE_TO_PARENT,其取值決定了對應的pivotXValue和pivotYValue的取值意義。該建構函式中的旋轉軸座標的取值規則與上面介紹的TranslateAnimation的最後一個建構函式中座標的取值規則完全一樣,在此不再贅述。此處給出一段示例程式碼:

    //以View的父控制元件中心點作為旋轉軸,建立旋轉360度的動畫
    int pivotXType = Animation.RELATIVE_TO_PARENT;
    float pivotXValue = 0.5f;
    int pivotYType = Animation.RELATIVE_TO_PARENT;
    float pivotYValue = 0.5f;
    Animation animation = new RotateAnimation(
        0, 360,
        pivotXType, pivotXValue,
        pivotYType, pivotYValue
    );
    //設定動畫持續時間
    animation.setDuration(3000);
    //通過View的startAnimation方法將動畫立即應用到View上
    textView.startAnimation(animation);

    介面如下所示:

    這裡寫圖片描述

    上面我們將pivotXType和pivotYType的值都設定為RELATIVE_TO_PARENT,然後將pivotXValue和pivotYValue都設定為0.5,這樣TextView的旋轉動畫將會以其父控制元件RelativeLayout的中心點作為旋轉軸旋轉360度。

    上述動畫對應的XML檔案如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%p"
        android:pivotY="50%p"
        android:duration="3000"
    />

    此處XML檔案中pivotX和pivotY的取值規則與之前提到的Translate動畫的XML檔案中fromXDelta等引數的取值規則相同。pivotX和pivotY的值都以%p結尾,表示取值型別是Animation.RELATIVE_TO_PARENT,50%p即表示相對於父控制元件的中心。


ScaleAnimation

ScaleAnimation可以讓View實現伸縮動畫效果,它有三個常用的建構函式,分別是:

public ScaleAnimation (float fromXScale, float toScaleX, float fromYScale, float toScaleY)

public ScaleAnimation (float fromXScale, float toScaleX, float fromYScale, float toScaleY, float pivotX, float pivotY)

public ScaleAnimation (float fromXScale, float toScaleX, float fromYScale, float toScaleY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

ScaleAnimation需要兩種型別的引數:縮放動畫的中心點以及XY兩個方向的縮放比例。View會基於動畫的縮放中心按照指定的縮放比例進行縮放。ScaleAnimation的三個建構函式的主要區別在於確定動畫的縮放中心,我們具體研究一下。

  • public ScaleAnimation (float fromXScale, float toScaleX, float fromYScale, float toScaleY)

    該建構函式只需要傳入View在X軸、Y軸上動畫開始以及結束的縮放比例,fromXScale和toScaleX分別表示動畫開始和結束時X軸的縮放比例,fromYScale和toScaleY表示動畫開始和結束時Y軸的縮放比例。不需要額外傳入引數設定動畫的縮放中心。這種情況下,動畫的縮放中心就是View的左上角點。該建構函式的使用方法如下所示:

    //以View左上角作為縮放中心,水平方向擴大一倍,垂直方向縮小為原來的一半
    float fromXScale = 1.0f;
    float toScaleX = 2.0f;
    float fromYScale = 1.0f;
    float toScaleY = 0.5f;
    Animation animation = new ScaleAnimation(fromXScale, toScaleX, fromYScale, toScaleY);
    //設定動畫持續時間
    animation.setDuration(3000);
    //通過View的startAnimation方法將動畫立即應用到View上
    textView.startAnimation(animation);

    介面如下所示:
    這裡寫圖片描述

    如上圖所示,TextView以其左上角點作為縮放中心,在X軸方向擴大了一倍,在Y軸方向縮減為原來的一半。

    上述動畫對應的XML檔案如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromXScale="1"
        android:toXScale="2"
        android:fromYScale="1"
        android:toYScale="0.5"
        android:duration="3000"
    />
  • public ScaleAnimation (float fromXScale, float toScaleX, float fromYScale, float toScaleY, float pivotX, float pivotY)

    很多情況下用View的左上角點作為縮放中心不能滿足實際需求,那麼我們就可以利用該建構函式傳入動畫縮放中心的位置座標(pivotX,pivotY)。需要說明的是,此處的座標(pivotX,pivotY)指的是View自身的區域性座標系中的座標。所謂的View自身的區域性座標系就是以View自身的左上角為座標原點的座標系。該建構函式的使用方法如下所示:

    //以View中心點作為縮放中心,水平方向和垂直方向都縮小為原來的一半
    float fromXScale = 1.0f;
    float toScaleX = 0.5f;
    float fromYScale = 1.0f;
    float toScaleY = 0.5f;
    float pivotX = textView.getWidth() / 2;
    float pivotY = textView.getHeight() / 2;
    Animation animation = new ScaleAnimation(
        fromXScale, toScaleX,
        fromYScale, toScaleY,
        pivotX, pivotY
    );
        //設定動畫持續時間
        animation.setDuration(3000);
        //通過View的startAnimation方法將動畫立即應用到View上
        textView.startAnimation(animation);

    介面如下所示:
    這裡寫圖片描述

    在上面的程式碼中,我們將TextView的中心點作為動畫的縮放中心,如上圖所示,TextView基於該縮放中心在水平方向和垂直方向都縮小為原來的一半。

    假設TextView的getWidth()和getHeight()返回的寬度、高度分別是是200畫素和100畫素,那麼上述動畫對應的XML檔案如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromXScale="1"
        android:toXScale="0.5"
        android:fromYScale="1"
        android:toYScale="0.5"
        android:pivotX="100"
        android:pivotY="50"
        android:duration="3000"
    />

    此處XML檔案中pivotX和pivotY的取值規則與之前提到的Translate動畫的XML檔案中fromXDelta等引數的取值規則相同。此處XML檔案中pivotX和pivotY的取值都是簡單的float型別,表示該值的型別是Animation.ABSOLUTE。 其實此處如果將pivotX和pivotY的值都設定為50%也能達到以TextView中心點縮放的目的,詳見下文。

  • public ScaleAnimation (float fromXScale, float toScaleX, float fromYScale, float toScaleY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

    該建構函式是最靈活的一種方式。pivotXType和pivotYType可取值ABSOLUTE或RELATIVE_TO_SELF或RELATIVE_TO_PARENT,其取值決定了對應的pivotXValue和pivotYValue的取值意義。該建構函式中的旋轉軸座標的取值規則與上面介紹的TranslateAnimation的最後一個建構函式中座標的取值規則完全一樣,在此不再贅述。此處給出一段示例程式碼:

    //以View中心點作為縮放中心,水平方向和垂直方向都縮小為原來的一半
    float fromXScale = 1.0f;
    float toScaleX = 0.5f;
    float fromYScale = 1.0f;
    float toScaleY = 0.5f;
    int pivotXType = Animation.RELATIVE_TO_SELF;
    float pivotXValue = 0.5f;
    int pivotYType = Animation.RELATIVE_TO_SELF;
    float pivotYValue = 0.5f;
    Animation animation = new ScaleAnimation(
        fromXScale, toScaleX,
        fromYScale, toScaleY,
        pivotXType, pivotXValue,
        pivotYType, pivotYValue
    );
    //設定動畫持續時間
    animation.setDuration(3000);
    //通過View的startAnimation方法將動畫立即應用到View上
    textView.startAnimation(animation);

    上面的程式碼實現的效果跟第二個建構函式中給出的程式碼實現的效果完全一致,只不過這次設定了pivotXType和pivotYType,並將其值都設定為RELATIVE_TO_SELF,且pivotXValue和pivotYValue都設定為0.5,這樣就將TextView的中心點設定成了動畫的縮放中心。效果參考第二個建構函式中的效果圖。

    上述動畫對應的XML檔案如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromXScale="1"
        android:toXScale="0.5"
        android:fromYScale="1"
        android:toYScale="0.5"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="3000"
    />

    以%結尾表示值的型別是Animation.RELATIVE_TO_SELF,此處pivotX和pivotY都取值50%,表示相對於TextView自身的中心點進行縮放。如果以%p結尾,那麼表示值的型別是Animation.RELATIVE_TO_PARENT。

希望本文對大家理解Android中的檢視動畫有所幫助!

相關文章