個人博客地址:https://blog.yookingh.cn
該文章地址:https://blog.yookingh.cn/dev/200514-bug-flash.html
前言
公司項(xiàng)目:頁面跳轉(zhuǎn) - 轉(zhuǎn)場動畫為默認(rèn)動畫
情況介紹:從A頁面跳轉(zhuǎn)B頁面后,B頁面做了網(wǎng)絡(luò)請求,請求過程會彈出LoadingDialog香浩,請求結(jié)束關(guān)閉LoadingDialog并根據(jù)請求結(jié)果刷新當(dāng)前界面瞬雹。
異常情況:A頁面跳轉(zhuǎn)B頁面同窘,B頁面網(wǎng)絡(luò)請求成功時,會頻繁偶現(xiàn)A頁面閃現(xiàn)的情況。
Bug分析與處理
Bug分析:應(yīng)該是A頁面跳轉(zhuǎn)B頁面過程中,動畫未完成時菱鸥,A頁面在任務(wù)棧頂部。此時B頁面網(wǎng)絡(luò)請求加載完畢重新渲染頁面(可以理解為B頁面強(qiáng)行轉(zhuǎn)入任務(wù)棧頂部)躏鱼,導(dǎo)致轉(zhuǎn)場動畫效果中斷氮采,A頁面重新展示,并B頁面緊跟著移動到任務(wù)棧頂部染苛。
解決方案:使用自定義轉(zhuǎn)場動畫替代默認(rèn)轉(zhuǎn)場動畫扳抽。
理由:自定義轉(zhuǎn)場動畫為B頁面動畫,非A頁面動畫殖侵,此時B頁面在任務(wù)棧頂部贸呢,B頁面的數(shù)據(jù)渲染不影響B(tài)頁面自身的動畫。
轉(zhuǎn)場動畫代碼如下:src\res\anim
A跳B時:
B進(jìn)場動畫:on_activity_open_enter.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300">
<!--從屏幕右邊往屏幕移動 直至覆蓋整個屏幕-->
<translate
android:fromXDelta="100%p"
android:toXDelta="0%p" />
</set>
A退場動畫:on_activity_open_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300">
<!--界面從右往左邊移動,直至消失在屏幕的左邊-->
<translate
android:fromXDelta="0%p"
android:toXDelta="-100%p" />
</set>
B回到A時:
A進(jìn)場動畫:on_activity_close_enter.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300">
<!--從屏幕的左邊往屏幕移動,直至重新遮住整個屏幕-->
<translate
android:fromXDelta="-100%p"
android:toXDelta="0%p" />
</set>
B退場動畫:on_activity_close_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300">
<!--從屏幕往屏幕右邊移動,直至消失在界面右邊-->
<translate
android:fromXDelta="0%p"
android:toXDelta="100%p" />
</set>
在src\res\values\styles.xml
中調(diào)用
<!--配置進(jìn)場出場動畫-->
<style name="Animation" parent="@android:style/Animation">
<item name="android:activityOpenEnterAnimation">@anim/on_activity_open_enter</item>
<item name="android:activityOpenExitAnimation">@anim/on_activity_open_exit</item>
<item name="android:activityCloseEnterAnimation">@anim/on_activity_close_enter</item>
<item name="android:activityCloseExitAnimation">@anim/on_activity_close_exit</item>
<item name="android:taskOpenEnterAnimation">@anim/on_activity_open_enter</item>
<item name="android:taskOpenExitAnimation">@anim/on_activity_open_exit</item>
<item name="android:taskCloseEnterAnimation">@anim/on_activity_close_enter</item>
<item name="android:taskCloseExitAnimation">@anim/on_activity_close_exit</item>
<item name="android:taskToFrontEnterAnimation">@null</item>
<item name="android:taskToFrontExitAnimation">@null</item>
<item name="android:taskToBackEnterAnimation">@null</item>
<item name="android:taskToBackExitAnimation">@null</item>
</style>
<!--將動畫配置到theme中-->
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowAnimationStyle">@style/Animation</item>
</style>
在AndroidManifest.xml
中引用
<application
...
android:theme="@style/AppBaseTheme">
...
</application>