Android進階學習(二)Android動畫分析

文本是閱讀《Android開發藝術探索》的學習筆記記錄,詳細內容可以自行閱讀書本。

Android動畫分析

  Android的動畫可以分爲三種:View動畫、幀動畫和屬性動畫。雖然幀動畫也屬於View動畫,但是與傳統方式不同,所以單獨從分類中取出。

1 View動畫

  View動畫的作用對象是View,它支持4種動畫效果,分別是平移動畫、縮放動畫、旋轉動畫和透明度動畫。

1.1 View動畫的種類

名稱 標籤 子類 效果
平移動畫 <translate> TranslateAnimation 移動View
縮放動畫 <scale> ScaleAnimation 放大或縮小View
旋轉動畫 <rotate> RotateAnimation 旋轉View
透明度動畫 <alpha> AlphaAnimation 改變View的透明度

  要使用View動畫,首先需要創建動畫的XML文件。路徑爲res/anim/filename.xml。如下,

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <alpha
        android:fromAlpha=""
        android:toAlpha=""></alpha>

    <translate
        android:fromXDelta=""
        android:fromYDelta=""
        android:toXDelta=""
        android:toYDelta=""></translate>

    <scale
        android:fromXScale=""
        android:fromYScale=""
        android:pivotX=""
        android:pivotY=""
        android:toXScale=""
        android:toYScale=""></scale>

    <rotate
        android:fromDegrees=""
        android:pivotX=""
        android:pivotY=""
        android:toDegrees=""></rotate>
</set>

  從上面語法可以看出,View動畫可以由單一動畫或者一系列動畫組成。

  <set>標籤表示動畫集合,對應AnimationSet類,它的兩個屬性含義如下:
  android:interpolator:表示動畫集合採用的插值器,插值器會影響動畫的速度,例如勻速、非勻速等等。
  android:shareInterpolator:表示集合中的動畫是否和集合共享同一個插值器。

  <translate>標籤表示平移動畫,對應TranslateAnimation類,屬性含義如下:
  android:fromXDelta:表示x的起始值,比如0。
  android:toXDelta:表示x的結束值,比如100。
  android:fromYDelta:表示y的起始值,比如0。
  android:toYDelta:表示y的結束值,比如100。

  <scale>標籤表示縮放動畫,對應ScaleAnimation類,屬性含義如下:
  android:fromXScale:水平方向縮放的起始值,比如0.5。
  android:toXScale:水平方向縮放的結束值,比如1.2。
  android:fromYScale:豎直方向縮放的起始值。
  android:toYScale:豎直方向縮放的結束值。
  android:pivotX:縮放的軸點的x座標。
  android:pivotY:縮放的軸點的y座標。
  默認情況下,縮放是以View的中心點爲軸點進行,當水平縮放時,左右兩邊同時進行縮放。如果將軸點的x座標設置在左邊界,當水平縮放時,View就只會向右邊縮放。

  <rotate>標籤表示旋轉動畫,對應RotateAnimation類,屬性含義如下:
  android:fromDegrees:旋轉開始的角度,比如0。
  android:toDegrees:旋轉結束的角度,比如180。
  android:pivotX:旋轉的軸點的x座標。
  android:pivotY:旋轉的軸點的y座標。

  <alpha>標籤表示旋轉動畫,對應RotateAnimation類,屬性含義如下:
  android:fromAlpha:表示透明度的起始值,比如0.1。
  android:toAlpha:表示透明度的結束值,比如1。

  除此之外,還有一些常用的屬性,如下:
  android:fillAfter:動畫結束後是否停留在結束位置。
  android:duration:動畫的持續時間。

代碼中,如下引用。

Animation animation = AnimationUtils.loadAnimation(this, R.anim.test);
startBt.startAnimation(animation);

除了XML定義外,也可以代碼簡單創建動畫,如下。

    AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
    alphaAnimation.setDuration(300);
    alphaAnimation.setRepeatCount(Animation.INFINITE);
    stopBt.startAnimation(alphaAnimation);

1.2 幀動畫

  幀動畫是順序播放一組圖片,類似電影播放,我們需要通過目錄在drawable下的XML文件來定義一個AnimationDrawable,如下。

<?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/ic_launcher_background"
        android:duration="500"></item>
    <item
        android:drawable="@drawable/ic_launcher_background"
        android:duration="500"></item>
    <item
        android:drawable="@drawable/ic_launcher_background"
        android:duration="500"></item>

</animation-list>

2 View動畫的特殊使用場景

2.1 LayoutAnimation

  LayoutAnimation作用與ViewGroup,爲ViewGroup指定一個動畫,這樣它的每個子元素出場時都會有這種動畫效果。這種效果常用於ListView上,使每個item都以一定動畫的形式出現。操作步驟如下。

(1)首先定義LayoutAnimation

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:animation="@anim/test"
    android:animationOrder="normal"
    android:delay="0.5">

</layoutAnimation>

  android:delay:動畫的時間延遲。
  android:animationOrder:子元素動畫入場的順序。
  android:animation:子元素的具體入場動畫。

(2)爲子元素指定具體入場動畫

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="100"
    android:fillAfter="true"
    android:shareInterpolator="true">

        <alpha
            android:fromAlpha="0.0"
            android:toAlpha="1.0"></alpha>
    
</set>

(3)爲ViewGroup指定android:layoutAnimation屬性

android:layoutAnimation="@anim/layout_anim"

或者代碼中實現,代碼如下。

    Animation animation = AnimationUtils.loadAnimation(this, R.anim.test);
    LayoutAnimationController controller = new LayoutAnimationController(animation);
    controller.setDelay(500);
    controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
    listView.setLayoutAnimation(controller);

2.2 Activity切換效果

  Activity有默認的切換效果,但是我們可以自定義這個效果。主要用到overridePendingTransition()方法,這個方法必須在startActivity()或者finish()之後調用才能生效。參數中一個代表打開時動畫,一個代表暫停時動畫。

    finish();
    overridePendingTransition(R.anim.test, R.anim.test);

3 屬性動畫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章