之前項目中遇到打開Activity后黑屏的問題,網上找到解決辦法是通過設置theme和style屬性可以實現(xiàn)。
http://www.cnblogs.com/sunzn/p/3407078.html
之前在做 APP 的時候不太關注這個問題,因為自己在使用其他 APP 的時候也會在應用啟動的初始有一個黑屏閃過后才會出現(xiàn)應用的歡迎頁。直到最近開發(fā)過程中發(fā)現(xiàn)自己在歡迎頁啟動的線程由于請求和處理的數(shù)據(jù)量過大而,導致歡迎頁在出現(xiàn)之前界面上會有一個短暫的白色閃屏停留,當然白色閃屏的停留是因為 application 的主題樣式android:theme="@style/AppTheme" 使用了 Theme.Light 題導致的,Light 樣式的 windowBackground、colorBackground、colorForeground 等屬性的值均為 light 也就是白色偏亮,所以才會出現(xiàn)白色閃屏。下面是我的 APP 出現(xiàn)白色閃屏時樣式引用的代碼:
<style name="AppTheme" parent="android:Theme.Light">
</style>
簡單的修改后,閃屏顏色為黑色,代碼如下:
<style name="AppTheme" parent="android:style/Theme.Black.NoTitleBar.Fullscreen">
</style>
代碼修改后引用的樣式為黑色主題,但歡迎頁仍然會有黑色閃屏短暫的停留。繼續(xù)進行修改,設置透明屬性為 true,代碼如下:
<style name="AppTheme" parent="android:style/Theme.Black.NoTitleBar.Fullscreen">
<item name="android:windowIsTranslucent">true</item>
</style>
經過這次的修改之后黑色閃屏現(xiàn)象消失了,最終達到了自己理想的效果。最后,經過查閱資料發(fā)現(xiàn)已經有人總結和處理過這類問題了,并且給出了優(yōu)缺點的分析,我在這里以我的理解對其進行引用。
原來避免黑色閃屏有2種方法,分別為:1.為 Theme 設置背景圖;2.為 Theme 設置透明屬性。顯然我采用的是第二種方式,先分別看看這2種方式所引用的代碼:
<!-- 為 Theme 設置背景圖 -->
<style name="AppTheme" parent="android:style/Theme.Black.NoTitleBar.Fullscreen">
<item name="android:windowBackground">@drawable/splash_bg</item>
</style>
<!-- 為 Theme 設置透明屬性 -->
<style name="AppTheme" parent="android:style/Theme.Black.NoTitleBar.Fullscreen">
<item name="android:windowIsTranslucent">true</item>
</style>
上面的2種 Theme 中,為 Theme 設置背景圖后程序在啟動的時候,會首先顯示這張圖,避免發(fā)生黑屏;為 Theme 設置透明屬性,程序啟動后不會黑屏而是透明,等到界面初始化完成后才一次性顯示出來。下面是兩種方式的優(yōu)缺點:
為 Theme 設置背景圖 給人程序啟動快的感覺,界面先顯示背景圖,然后再刷新其他界面控件,刷新不同步。
為 Theme 設置透明屬性 給人程序啟動慢的感覺,界面會一次性刷出來,刷新同步。
但是問題有出現(xiàn)了,原先在配置了activity的切換動畫效果,設置完android:windowIsTranslucent=true之后切換動畫失效了。暫時我也不知道android系統(tǒng)的theme屬性之間關系的錯綜復雜,繼承來繼承去的。。。為什么會出現(xiàn)這種問題,不過還好無意間找到了解決辦法
<style name="AppTheme" parent="AppBaseTheme">
<!-- <item name="android:windowAnimationStyle">@style/Animation.Activity.Style</item> -->
<item name="android:windowAnimationStyle">@style/Animation.Activity.Translucent.Style</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
</style>
<style name="Animation.Activity.Style" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/base_slide_right_in</item>
<item name="android:activityOpenExitAnimation">@anim/base_stay_orig</item>
<item name="android:activityCloseEnterAnimation">@anim/base_stay_orig</item>
<item name="android:activityCloseExitAnimation">@anim/base_slide_right_out</item>
<item name="android:taskOpenEnterAnimation">@anim/base_slide_right_in</item>
<item name="android:taskOpenExitAnimation">@anim/base_stay_orig</item>
<item name="android:taskCloseEnterAnimation">@anim/base_stay_orig</item>
<item name="android:taskCloseExitAnimation">@anim/base_slide_right_out</item>
<item name="android:taskToFrontEnterAnimation">@anim/base_slide_right_in</item>
<item name="android:taskToFrontExitAnimation">@anim/base_stay_orig</item>
<item name="android:taskToBackEnterAnimation">@anim/base_stay_orig</item>
<item name="android:taskToBackExitAnimation">@anim/base_slide_right_out</item>
</style>
<style name="Animation.Activity.Translucent.Style" parent="@android:style/Animation.Translucent">
<item name="android:windowEnterAnimation">@anim/base_slide_right_in</item>
<item name="android:windowExitAnimation">@anim/base_slide_right_out</item>
</style>
配置style繼承的parent為
<style name="Animation.Activity.Translucent.Style" parent="@android:style/Animation.Translucent">
<item name="android:windowEnterAnimation">@anim/base_slide_right_in</item>
<item name="android:windowExitAnimation">@anim/base_slide_right_out</item>
然后讓apptheme的
android:windowAnimationStyle為上面的style
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:windowAnimationStyle">@style/Animation.Activity.Translucent.Style</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
</style>
MainActivity的退出和進入動畫可以引用系統(tǒng)提供的,但是好像在style里面配置引用不了有些系統(tǒng)的anim,
在文件夾sdk\platforms\android-20\data\res下面,activity_open_enter.xml,activity_close_exit.xml可以直接拷貝到項目中,修改
單獨寫一個進入或者退出,然后其它默認。。。。。。。
多動手,測試,如果有錯誤的地方麻煩留言一起交流,謝謝
引用自 [https://blog.csdn.net/fancylovejava/article/details/39643449]