【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 類。