1. 程式人生 > >【Android】Activity進入和退出動畫

【Android】Activity進入和退出動畫

方法一:自定義styles.xml檔案,在AndroidManifest.xml清單檔案中註冊android:theme以實現動畫,然後正常啟動頁面即可(application中設定應所有頁面,activity中設定應用單個頁面)

注意事項: 
1、activityOpenEnterAnimation、activityOpenExitAnimation指定的是入場動畫 
2、activityCloseEnterAnimation、activityCloseExitAnimation指定的是出場動畫 
3、activityOpenEnterAnimation、activityCloseExitAnimation針對即將要開啟的頁面 
4、activityOpenExitAnimation、activityCloseEnterAnimation針對的是當前頁面

  • 注意使用此方法設定activity動畫時,出場動畫不起效果,暫時原因未知,解決方案:在呼叫finish方法之後呼叫overridePendingTransition方法,具體使用方法請見方法二。

styles.xml檔案:

<style name="AppBaseTheme" parent="android:Theme.Light"></style> 
<!-- 頁面彈出(入場出場)動畫 --> 
<style name="AnimationActivity" parent="@android:style/Animation">
    <item
name="android:activityOpenEnterAnimation">@anim/in_from_right</item > <item name="android:activityOpenExitAnimation">@anim/in_from_right_abit</item > <item name="android:activityCloseEnterAnimation">@anim/out_to_right_abit</item > <item name="android:activityCloseExitAnimation"
>@anim/out_to_right</item >
</style> <style name="ActivitySlideTheme" parent="AppBaseTheme"> <item name="android:windowNoTitle">true</item > <item name="android:windowAnimationStyle">@style/AnimationActivity</item> </style>

AndroidManifest.xml

    <!--指定application的theme--><!--應用所有的activity-->
    <application android:theme="@style/ActivitySlideTheme">
    <!--指定activtiy的theme--><!--指定單個的activity-->
    <activity  android:theme="@style/ActivitySlideTheme">

方法二:android 2.0版本後加入了overridePendingTransition函式可以實現該效果

注意事項: 
1、該函式必須在startActivity和finish之後呼叫 
2、startActivity方法之後呼叫是設定入場動畫 
3、finish方法之後呼叫是設定出場動畫 
4、void android.app.Activity.overridePendingTransition(int enterAnim, int exitAnim) 
enterAnim:指定入場動畫(針對即將要展示的頁面) 
exitAnim:指定出場動畫(針對即將要關閉或隱藏的頁面)

使用說明:

  • 注意,在定義入場動畫時,應該確保在主執行緒執行,否則有可能會無效。所以,儘量在呼叫處使用Activity.runOnUiThread(new Runnable() {XXXX}); 
    新增原因:此段程式碼寫在JS要呼叫的原生介面中可能不在主執行緒中執行,會出現動畫效果時有時無
 @Override
  public void run() {
      Intent intent = new Intent(currentActivity,TestActivity.class);
      // 新增引數
      intent.putExtra(Constants.KEY_INETNT_PARAMS,payParams);
      intent.putExtra(Constants.KEY_INETNT_TITLE,name);
      currentActivity.startActivity(intent);
      // 定義出入場動畫              currentActivity.overridePendingTransition(R.anim.in_from_right,R.anim.in_from_right_abit);
   }
});

TestActivity.class類檔案中:

 /**
   * 點選系統返回和頁面返回鍵時的處理
   */
  private void backClick() {
      finish();
      // 定義出入場動畫
      overridePendingTransition(R.anim.out_to_right_abit,R.anim.out_to_right);
  }

方法一和方法二對比:

方法一:使用成本比較大,每次啟動頁面或關閉頁面均需要呼叫overridePendingTransition,

改善方案:重寫startActivty()和finish()方法,如果要設定到整個app的頁面可以定義基類如BaseActivity,然後重寫基類的startActivty()和finish()方法。

方法二:只需在清單檔案中配置,做通用配置比較簡單,但是出場動畫設定無效很頭疼,目前原因還未知。

解決方案:

/**
 * 點選系統返回和頁面返回鍵時的處理
 */
 private void backClick() {
    finish();
    // 定義出入場動畫
    overridePendingTransition(R.anim.out_to_right_abit,R.anim.out_to_right);
 }

anim資料夾下自定義的動畫:

in_from_right_abit.xml:

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

in_from_right.xml:

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

out_to_right_abit.xml:

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

out_to_right.xml:

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

具體動畫可根據自己專案需求自定義 
另:Android已經內建了幾種動畫效果,可以見 android.R.anim 類。