之前在做 APP 的時候不太關注這個問題,因為自己在使用其他 APP 的時候也會在應用啟動的初始有一個黑屏閃過后才會出現應用的歡迎頁。直到最近開發過程中發現自己在歡迎頁啟動的線程由於請求和處理的數據量過大而,導致歡迎頁在出現之前界面上會有一個短暫的白色閃屏停留,當然白色閃屏的停留是因為 application 的主題樣式 android:theme="@style/AppTheme" 使用了 Theme.Light 題導致的,Light 樣式的 windowBackground、colorBackground、colorForeground 等屬性的值均為 light 也就是白色偏亮,所以才會出現白色閃屏。下面是我的 APP 出現白色閃屏時樣式引用的代碼:
<style name="AppTheme" parent="android:Theme.Light">
</style>
簡單的修改后,閃屏顏色為黑色,代碼如下:
<style name="AppTheme" parent="android:style/Theme.Black.NoTitleBar.Fullscreen"> </style>
代碼修改后引用的樣式為黑色主題,但歡迎頁仍然會有黑色閃屏短暫的停留。繼續進行修改,設置透明屬性為 true,代碼如下:
<style name="AppStartTheme" parent="android:style/Theme.Black.NoTitleBar.Fullscreen"> <item name="android:windowIsTranslucent">true</item> </style>
經過這次的修改之后黑色閃屏現象消失了,最終達到了自己理想的效果。最后,經過查閱資料發現已經有人總結和處理過這類問題了,並且給出了優缺點的分析,我在這里以我的理解對其進行引用。
原來避免黑色閃屏有2種方法,分別為:1.為 Theme 設置背景圖;2.為 Theme 設置透明屬性。顯然我采用的是第二種方式,先分別看看這2種方式所引用的代碼:
<!-- 為 Theme 設置背景圖 --> <style name="AppStartTheme" parent="android:Theme"> <item name="android:windowBackground">@drawable/splash_bg</item> <item name="android:windowNoTitle">true</item> </style>
<!-- 為 Theme 設置透明屬性 --> <style name="AppStartTheme" parent="android:Theme"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowNoTitle">true</item> </style>
<!-- 為 Activity 設置 Theme --> <activity android:name="com.sunzn.act.SplashActivity" android:label="@string/app_name" android:theme="@style/AppStartLoadTranslucent" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
上面的2種 Theme 中,為 Theme 設置背景圖后程序在啟動的時候,會首先顯示這張圖,避免發生黑屏;為 Theme 設置透明屬性,程序啟動后不會黑屏而是透明,等到界面初始化完成后才一次性顯示出來。下面是兩種方式的優缺點:
- 為 Theme 設置背景圖 給人程序啟動快的感覺,界面先顯示背景圖,然后再刷新其他界面控件,刷新不同步。
- 為 Theme 設置透明屬性 給人程序啟動慢的感覺,界面會一次性刷出來,刷新同步。