【Android - 進階】之Animation補間動畫

  補間動畫也叫View動畫,它只能針對View進行動畫操做,且補間動畫操做的只是View中可見的部分,即只操做界面,對於可點擊區域等都不會進行操做。android

  在Android中,補間動畫的頂級類是Animation。補間動畫包括對View的透明度、縮放、平移、旋轉進行動畫操做,對應的JAVA類分別是AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation。app

  Android還提供了一個動畫集合AnimationSet,能夠將多個動畫單體放入集合中共同進行,集合中的多個動畫能夠選擇共享一套動畫差值器和執行時間。dom

  本文將從兩個角度介紹補間動畫,第一是從補間動畫的基本使用介紹,第二是介紹補間動畫在實際開發中的其餘應用,包括用於指定ViewGroup中View的動畫的LayoutAnimation、用於控制Activity切換效果的動畫等。ide

基本使用介紹

  補間動畫能夠寫在XML文件中,也能夠寫在JAVA文件中,但官方推薦寫在XML文件中,由於XML格式更加易於閱讀。佈局

  在補間動畫的XML表示法中,咱們可使用<alpha>、<scale>、<translate>、<rotate>分別表示四種動畫,也可使用<set>標籤表示一個動畫集合。下面是一個包括全部屬性的補間動畫XML文件描述的示例,代碼以下:動畫

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

    <alpha
        android:fromAlpha="0%"
        android:toAlpha="100%" />

    <scale
        android:fromXScale="100%"
        android:fromYScale="100%"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="200%"
        android:toYScale="200%" />

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

    <rotate
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="360" />

</set>

  上述代碼中各個屬性的詳細解釋以下:spa

android:interpolator:差值器,用來控制動畫的速度
    BounceInterpolator:彈跳效果;
    AccelerateInterpolator:逐漸加速;
    DecelerateInterpolator:逐漸減速;
    AccelerateDecelerateInterpolator:先加速後減速;
    OvershootInterpolator:到達目標點時「跑過頭了」,再返回到目標點;
    AnticipateInterpolator:移動以前先向後「助跑」;
    AnticipateOvershootInterpolator:OvershootInterpolator和AnticipateInterpolator的組合效果;
    CycleInterpolator:對於指定的動畫,正向作一遍,反響作一遍
android:shareInterpolator:<set>標籤中的動畫是否共享差值器
android:duration:動畫集合播放時間
android:fillAfter:動畫結束後是否停留在最後的狀態
<alpha>:透明度動畫
    android:fromAlpha:動畫開始時候的透明度
    android:toAlpha:動畫結束時候的透明度
<scale>:縮放動畫
    android:fromXScale:動畫開始時候X軸的縮放倍數
    android:fromYScale:動畫開始時候Y軸的縮放倍數
    android:pivotX:縮放中心點X座標
    android:pivotY:縮放中心點Y座標
    android:toXScale:動畫結束時候X軸的縮放倍數
    android:toYScale:動畫結束時候Y軸的縮放倍數
<translate>:平移動畫
    android:fromXDelta:動畫開始時候X軸的座標位置
    android:fromYDelta:動畫開始時候Y軸的座標位置
    android:toXDelta:動畫結束時候X軸的座標位置
    android:toYDelta:動畫結束時候Y軸的座標位置
<rotate>:旋轉動畫
    android:fromDegrees:動畫開始時候的角度
    android:toDegrees:動畫結束時候的角度
    android:pivotX:旋轉中心點的X座標
    android:pivotY:旋轉中心點的Y座標

  除了使用XML格式編寫動畫代碼,還能夠在JAVA代碼中編寫動畫代碼,此時就須要用到AnimationSet、AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation這幾個類了。下面是一個使用JAVA代碼編寫動畫的代碼:code

AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, 0.5f, 0.5f);
TranslateAnimation translateAnimation = new TranslateAnimation(0.0f, 500.0f, 0.0f, 500.0f);
RotateAnimation rotateAnimation = new RotateAnimation(0.0f, 360.0f, 0.5f, 0.5f);

AnimationSet set = new AnimationSet(true);
set.setDuration(1000);
set.addAnimation(alphaAnimation);
set.addAnimation(scaleAnimation);
set.addAnimation(translateAnimation);
set.addAnimation(rotateAnimation);
set.start();

其餘使用方法

  上一章節中介紹了補間動畫Animation的基本使用,這個章節將介紹補間動畫的一些其餘的使用方法。orm

LayoutAnimation

  LayoutAnimation用於統一地控制ViewGroup中每一個View的動畫效果,還能夠控制每一個View動畫之間的間隔,達到依次入場的效果。例如,在下面的例子中,咱們將控制一個ListView中全部Item的入場動畫,達到全部Item依次入場的效果。xml

  ListView中有一個屬性: android:layoutAnimation ,這個屬性用於控制ListView做爲一個ViewGroup,其內全部Item的動畫。layout文件中ListView的佈局代碼以下:

<ListView
    android:id="@+id/animate_main_lv_listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:cacheColorHint="@android:color/transparent"
    android:divider="@android:color/darker_gray"
    android:dividerHeight="1.0dip"
    android:layoutAnimation="@anim/anim_layout_listview"
    android:scrollbars="none" />

  咱們須要新建一個動畫文件anim_layout_listview.xml,在這個文件中編寫LayoutAnimation,代碼以下:

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

  上述代碼中各個屬性的詳細解釋以下:

android:animation:每一個Item都執行的動畫
android:animationOrder:各Item的動畫執行順序,分爲normal順序、reverse逆序、random隨機
android:delay:各Item之間的動畫間隔,百分比,表示Item動畫時長的百分比
android:interpolator:動畫差值器

  咱們還須要建立另外一個動畫文件anim_item_listview.xml,用於表示每一個Item的動畫,代碼以下:

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

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

    <translate
        android:fromXDelta="500"
        android:toXDelta="0" />

</set>

  每一個Item都從透明都不透明,從右側平移到左側,且上下兩個Item之間的動畫間隔250ms(500ms * 50%)。

Activity切換動畫

  Activity的切換動畫通常須要四個動畫,分別表示新Activity進入時候的動畫、舊Activity退出時候的動畫、新Activity退出時候的動畫、舊Activity進入時候的動畫,所以,本例中分別使用anim_activity_new_in.xml、anim_activity_new_out.xml、anim_activity_old_in.xml、anim_activity_old_out.xml四個動畫文件表示。

  Activity的切換動畫也有兩種方式來控制,分別是經過JAVA代碼控制和經過XML代碼來配置。

  首先介紹使用JAVA代碼控制的方式,先來看代碼:

Intent intent = new Intent(context, NextActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.anim_activity_new_in, R.anim.anim_activity_old_out);

  能夠看到,直接使用 overridePendingTransition() 方法來控制便可,在方法中設置兩個參數,分別是新Activity進入和舊Activity退出的動畫資源ID,經過這一行代碼,就能夠簡單地實現Activity之間的切換動畫。須要注意的是,這個方法必須在startActivity()方法或finish()方法以後調用,不然無效。

  上面這種方法只能控制單個Activity的切換動畫,不能控制全局全部Activity的切換動畫。若是想要控制項目中全部Activity的切換動畫,就須要用到第二種方式:XML配置方式。

  在XML配置方式中,咱們既能夠控制全部Activity的切換動畫,也能夠控制單個Activity的切換動畫,只須要選擇在<application>總標籤中或某個特定的<activity>標籤中配置 android:theme 屬性便可。android:theme屬性指定了一個XML文件,下面貼出一個示例中的XML代碼:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowAnimationStyle">@style/activityAnimation</item>
</style>

<style name="activityAnimation" parent="@android:style/Animation">
    <item name="android:activityCloseEnterAnimation">@anim/anim_activity_old_in</item>
    <item name="android:activityCloseExitAnimation">@anim/anim_activity_old_out</item>
    <item name="android:activityOpenEnterAnimation">@anim/anim_activity_new_in</item>
    <item name="android:activityOpenExitAnimation">@anim/anim_activity_new_out</item>
</style>

  能夠看到,在AppTheme中設置了 android:windowAnimationStyle 屬性指定Activity切換的四種動畫,而後在下面引用了這四種動畫。這樣就配置好了項目中全部Activity的切換動畫。

相關文章
相關標籤/搜索