解決Activity啓動黑屏及設置android:windowIsTranslucent不兼容activity切換動畫問題

以前項目中遇到打開Activity後黑屏的問題,網上找到解決辦法是經過設置theme和style屬性能夠實現。html

http://www.cnblogs.com/sunzn/p/3407078.htmlandroid

以前在作 APP 的時候不太關注這個問題,由於本身在使用其餘 APP 的時候也會在應用啓動的初始有一個黑屏閃事後纔會出現應用的歡迎頁。直到最近開發過程當中發現本身在歡迎頁啓動的線程因爲請求和處理的數據量過大而,致使歡迎頁在出現以前界面上會有一個短暫的白色閃屏停留,固然白色閃屏的停留是由於 application 的主題樣式 android:theme = "@style/AppTheme" 使用了 Theme.Light 題致使的,Light 樣式的 windowBackground、colorBackground、colorForeground 等屬性的值均爲 light 也就是白色偏亮,因此纔會出現白色閃屏。下面是個人 APP 出現白色閃屏時樣式引用的代碼:app

<style name="AppTheme" parent="android:Theme.Light">

</style>

簡單的修改後,閃屏顏色爲黑色,代碼以下:ide

<style name="AppTheme" parent="android:style/Theme.Black.NoTitleBar.Fullscreen">

</style>

代碼修改後引用的樣式爲黑色主題,但歡迎頁仍然會有黑色閃屏短暫的停留。繼續進行修改,設置透明屬性爲 true,代碼以下:測試

<style name="AppTheme" parent="android:style/Theme.Black.NoTitleBar.Fullscreen">
        <item name="android:windowIsTranslucent">true</item>
</style>

通過此次的修改以後黑色閃屏現象消失了,最終達到了本身理想的效果。最後,通過查閱資料發現已經有人總結和處理過這類問題了,而且給出了優缺點的分析,我在這裏以個人理解對其進行引用。動畫

原來避免黑色閃屏有2種方法,分別爲:1.爲 Theme 設置背景圖;2.爲 Theme 設置透明屬性。顯然我採用的是第二種方式,先分別看看這2種方式所引用的代碼:spa

爲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 設置背景圖後程序在啓動的時候,會首先顯示這張圖,避免發生黑屏; 爲 Theme 設置透明屬性, 程序啓動後不會黑屏而是透明,等到界面初始化完成後才一次性顯示出來。下面是兩種方式的優缺點:線程

爲 Theme 設 置背景圖 給人程序啓動快的感受,界面先顯示背景圖,而後再刷新其餘界面控件,刷新不一樣步。 爲 Theme 設置透明屬性 給人程序啓動慢的感受,界面會一次性刷出來,刷新同步。 可是問題有出現了,原先在配置了activity的切換動畫效果,設置完android:windowIsTranslucent=true以後切換動畫失效了。暫時我也不知道android系統的theme屬性之間關係的錯綜複雜,繼承來繼承去的。。。爲何會出現這種問題,不過還好無心間找到了解決辦法code

<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爲htm

<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>

而後讓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>

若是想在全部的activity切換時候使用該theme,能夠配置application,也能夠單個單個配置在activity裏面。 固然首頁退出的時候能夠單獨配置MainActivity的退出動畫和進入動畫

<style name="Animation.Activity.Translucent.Style.Main" parent="@android:style/Animation.Translucent">
        <item name="android:windowExitAnimation">@anim/slide_right_out</item>
    </style>

單獨寫一個進入或者退出,而後其它默認。。。。。。。 多動手,測試,若是有錯誤的地方麻煩留言一塊兒交流,謝謝

相關文章
相關標籤/搜索