Android動畫深入分析——View動畫的特殊使用場景

在上節中我們介紹了View動畫的四種形式,除了這四種形式外,View動畫還可以在一些特殊的場景下使用,比如在ViewGroup中可以控制子元素的出場效果,在Activity中可以實現不同Activity之間的切換效果。

1.LayoutAnimation

LayoutAnimation作用於ViewGroup,爲ViewGroup指定一個動畫,這樣當它的子元素出場時都會具有這種動畫效果。這種效果常常被用在ListView上,我們市場會看到一種特殊的ListView,它的每個item都以一定的動畫的形式出現,其實這並非什麼高深的技術,它使用的就是LayoutAnimationLayoutAnimation也是一個View動畫,爲了給ViewGroup的子元素加上出場效果,遵循如下幾個步驟。
(1)定義LayoutAnimation,如下所示(res/anim/anim_layout.xml)。
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="0.5"
    android:animationOrder="normal"
    android:animation="@anim/anim_item"/>

它的屬性的含義如下所示。
android:delay——表示子元素開始動畫的時間延遲,比如子元素入場動畫的時間週期爲300ms,那麼0.5表示每個子元素都需要延遲150ms才能播放入場動畫,總體來說,第一個子元素延遲150ms開始播放入場動畫,第2個子元素延遲300ms開始播放入場動畫,依次類推。

android:animationOrder——表示子元素動畫的順序,有三種選項:normal、reverse和random,其中normal表示順序顯示,即排在前面的子元素先開始播放入場動畫;reverse表示逆向顯示,即排在後面的子元素先開始播放入場動畫;random則是隨機播放入場動畫。

android:animation——爲子元素指定具體的入場動畫。


(2)爲子元素指定具體的入場動畫,如下所示。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:shareInterpolator="true">
    <alpha android:toAlpha="1.0"
        android:fromAlpha="0.0"/>
    <translate android:fromXDelta="500"
        android:toXDelta="0"/>
</set>

(3)爲ViewGroup指定android:layoutAnimation屬性。對於ListView來說,這樣ListView的item就具有出場動畫了,這種方式適用於所有的ViewGroup,如下所示。
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layoutAnimation="@anim/anim_layout"
        android:background="#fff4f7f9"
        android:cacheColorHint="#00000000"
        android:divider="#dddbbd"
        android:dividerHeight="1dp"
        android:listSelector="@android:color/transparent"/>

除了再XML指定layoutAnimation外,還可以通過LayoutAnimationController來實現,具體代碼如下所示。
        ListView list_view = ((ListView)findViewById(R.id.list_view));
        list_view.setAdapter(getAdapter());
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item);
        LayoutAnimationController controller = new LayoutAnimationController(animation);
        controller.setDelay(0.5f);
        controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
        list_view.setLayoutAnimation(controller);

2.Activity的切換效果

Activity有默認的切換效果,但是這個效果我們是可以自定義的,主要用到overridePendingTransition(int enterAnim, int exitAnim)這個方法,這個方法必須再startActivity(Intent)或者finish之後被調用才能生效,它的參數含義如下:
enterAnim——Activity被打開時,所需要的動畫資源id;
exitAnim——Activity被暫停時,所需的動畫資源id;

當Activity時,可以按照如下方式爲其添加自定義的切換效果:
        Intent intent = new Intent(this, DemoActivity_1.class);
        startActivity(intent);
        overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);

當Activity退出時,也可以爲其指定自己的切換效果,如下所示。
    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);
    }

需要注意的是,overridePendingTransition這個方法必須位於startActivity或者finish的後面,否則動畫效果將不起作用。
Fragment也可以添加切換動畫,由於Fragment是再API11中引入的類,因此爲了兼容性,我們需要使用support-v4這個兼容包,在這種情況下我們可以通過FragmentTransaction中的setCustomAnimations方法來添加切換動畫。這個切換動畫需要是View動畫,之所以不能採用屬性動畫是因爲屬性動畫也是API11新引入的。還有其他方式可以給Activity和Fragment添加切換動畫,但是它們大多都有兼容性問題,在低版本上無法使用,因此不具有很高的使用加直,這裏就不再一一介紹了。

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