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

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

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

之前在做 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="AppTheme" parent="android:style/Theme.Black.NoTitleBar.Fullscreen">
        <item name="android:windowIsTranslucent">true</item>
    </style>

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

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

  • 爲 Theme 置背景圖       給人程序啓動快的感覺,界面先顯示背景圖,然後再刷新其他界面控件,刷新不同步。
  • 爲 Theme 設置透明屬性    給人程序啓動慢的感覺,界面會一次性刷出來,刷新同步。

但是問題有出現了,原先在配置了activity的切換動畫效果,設置完android:windowIsTranslucent=true之後切換動畫失效了。暫時我也不知道android系統的theme屬性之間關係的錯綜複雜,繼承來繼承去的。。。爲什麼會出現這種問題,不過還好無意間找到了解決辦法

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <style name="AppTheme" parent="AppBaseTheme">  
  2.   
  3.         <!-- <item name="android:windowAnimationStyle">@style/Animation.Activity.Style</item> -->  
  4.         <item name="android:windowAnimationStyle">@style/Animation.Activity.Translucent.Style</item>  
  5.         <item name="android:windowBackground">@android:color/transparent</item>  
  6.         <item name="android:windowIsTranslucent">true</item>  
  7.     </style>  
  8.   
  9.     <style name="Animation.Activity.Style" parent="@android:style/Animation.Activity">  
  10.         <item name="android:activityOpenEnterAnimation">@anim/base_slide_right_in</item>  
  11.         <item name="android:activityOpenExitAnimation">@anim/base_stay_orig</item>  
  12.         <item name="android:activityCloseEnterAnimation">@anim/base_stay_orig</item>  
  13.         <item name="android:activityCloseExitAnimation">@anim/base_slide_right_out</item>  
  14.         <item name="android:taskOpenEnterAnimation">@anim/base_slide_right_in</item>  
  15.         <item name="android:taskOpenExitAnimation">@anim/base_stay_orig</item>  
  16.         <item name="android:taskCloseEnterAnimation">@anim/base_stay_orig</item>  
  17.         <item name="android:taskCloseExitAnimation">@anim/base_slide_right_out</item>  
  18.         <item name="android:taskToFrontEnterAnimation">@anim/base_slide_right_in</item>  
  19.         <item name="android:taskToFrontExitAnimation">@anim/base_stay_orig</item>  
  20.         <item name="android:taskToBackEnterAnimation">@anim/base_stay_orig</item>  
  21.         <item name="android:taskToBackExitAnimation">@anim/base_slide_right_out</item>  
  22.     </style>  
  23.   
  24.     <style name="Animation.Activity.Translucent.Style" parent="@android:style/Animation.Translucent">  
  25.         <item name="android:windowEnterAnimation">@anim/base_slide_right_in</item>  
  26.         <item name="android:windowExitAnimation">@anim/base_slide_right_out</item>  
  27.     </style>  

配置style繼承的parent爲

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <style name="Animation.Activity.Translucent.Style" parent="@android:style/Animation.Translucent">  
  2.         <item name="android:windowEnterAnimation">@anim/base_slide_right_in</item>  
  3.         <item name="android:windowExitAnimation">@anim/base_slide_right_out</item>  
  4.     </style>  

然後讓apptheme的
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. android:windowAnimationStyle爲上面的style  

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <style name="AppTheme" parent="AppBaseTheme">  
  2.   
  3.         <item name="android:windowAnimationStyle">@style/Animation.Activity.Translucent.Style</item>  
  4.         <item name="android:windowBackground">@android:color/transparent</item>  
  5.         <item name="android:windowIsTranslucent">true</item>  
  6.     </style>  

如果想在所有的activity切換時候使用該theme,可以配置application,也可以單個單個配置在activity裏面。

當然首頁退出的時候可以單獨配置MainActivity的退出動畫和進入動畫

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <style name="Animation.Activity.Translucent.Style.Main" parent="@android:style/Animation.Translucent">  
  2.         <item name="android:windowExitAnimation">@anim/slide_right_out</item>  
  3.     </style>  


MainActivity的退出和進入動畫可以引用系統提供的,但是好像在style裏面配置引用不了有些系統的anim,

在文件夾sdk\platforms\android-20\data\res下面,activity_open_enter.xml,activity_close_exit.xml可以直接拷貝到項目中,修改

單獨寫一個進入或者退出,然後其它默認。。。。。。。

多動手,測試,如果有錯誤的地方麻煩留言一起交流,謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章