七、Android動畫

Android的動畫可以分爲3種,View動畫,幀動畫和屬性動畫,其實幀動畫也屬於
View動畫的一種,只不過它和平移,旋轉等常見的View動畫在表現形式上面略有
不同而已。
屬性動畫通過動態地改變對象的屬性從而達到動畫效果。

1.View動畫種類

AlphaAnimation, RotateAnimation, ScaleAnimation, TranslateAnimation

<?xml version="1.0" encoding="utf-8"?>
<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>
        ...
    </set>
</set>

這四種動畫既可以通過XML來定義,也可以通過代碼來動態創建,對於view動畫來說,建議採用XML來定義動畫。
set表示動畫集合,對應AnimationSet類,可以包含若干個動畫。
屬性:
android:interpolator表示動畫集合採用的插值器,插值器影響動畫的速度,比如非勻速動畫就需要通過插值器來控制動畫的播放過程。可以不指定。默認@android:anim/accelerate_decelerate_interpolator,即加速減速插值器。

android:shareInterpolator表示集合中的動畫是否和集合共享一個插值器,如果集合不指定插值器,那麼子動畫就需要單獨指定所需的插值器或者使用默認值。

translate:表示平移動畫,對應TranslateAnimation類,可以使一個View在水平和豎直方向完成平移的動畫效果。
android:fromXDelta表示X的起始值,比如0;
android:toXDelta表示X的結束值,比如100;
android:fromYDelta表示Y的起始值;
android:toYDelta表示Y的結束值

scale:表示縮放動畫,對應ScaleAnimation,可以使View具有放大或者縮小的動畫效果。
android:fromXScale水平方向縮放的起始值,比如0.5;
android:toXScale水平方向縮放的結束值,比如1.2;
android:fromYScale豎直方向縮放的起始值;
android:toYScale豎直方向縮放的結束值;
android:pivotX縮放軸點的x座標,它會影響縮放的效果;
android:pivotY縮放軸點的y座標,它會影響縮放的效果;

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

alpha表示透明度動畫,對應AlphaAnimation。
android:fromAlpha表示透明度的起始值,比如0.2;
android:toAlpha表示透明度的結束值,比如1;

還有些常用屬性,android:duration持續時間android:fillAfter動畫結束之後View是否停留在結束位置。

例子:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <scale
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="1.4"
        android:fromYScale="1.0"
        android:toYScale="0.6"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false"
        android:duration="700" />
    <set
        android:interpolator="@android:anim/accelerate_interpolator"
        android:startOffset="700">
        <scale
            android:fromXScale="1.4"
            android:toXScale="0.0"
            android:fromYScale="0.6"
            android:toYScale="0.0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:duration="400" />
        <rotate
            android:fromDegrees="0"
            android:toDegrees="-45"
            android:toYScale="0.0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:duration="400" />
    </set>
</set>

2.幀動畫

<?xml version="1.0" encoding="utf-8"?>
<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" />
</animation-list>

例子:

<?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/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();

3.View動畫的特殊使用場景

3.1.LayoutAnimation

<layoutAnimation
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="0.5"
    android:animationOrder="reverse"
    android:animation="@anim/anim_item"/>

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

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

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

<?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:fromAlpha="0.0"
        android:toAlpha="1.0" />
    <translate
        android:fromXDelta="500"
        android:toXDelta="0" />
</set>

爲ViewGroup指定android:layoutAnimation屬性。

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layoutAnimation="@anim/anim_layout"
        android:background="#fff4f7f9"
        android:cacheColorHint="#00000000"
        android:divider="#dddbdb"
        android:dividerHeight="1.0px"
        android:listSelector="@android:color/transparent" />

還可以通過代碼來指定:

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

3.2.Activity的切換效果

Activity有默認的切換效果,這個效果我們是可以自定義的,主要用到

overridePendingTransition(int enterAnim, int exitAnim)

這個方法。這個方法必須在startActivity()或者finish()之後調用才能生效。
參數含義:
enterAnim—Activity被打開時,所需要的動畫資源id;
exitAnim—Activity被暫停時,所需的動畫資源id;
當啓動一個Activity時,可以按照如下方式添加自定義切換效果:

Intent intent = new Intent(this, TestActivity.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);
    }

4.屬性動畫

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