解決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屬性之間關系的錯綜復雜,繼承來繼承去的。。。

為什么會出現這樣的問題,只是還好無意間找到了解決的方法

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


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

在目錄sdk\platforms\android-20\data\res以下,activity_open_enter.xml,activity_close_exit.xml能夠直接復制到項目中。改動

單獨寫一個進入或者退出。然后其他默認。。。

。。

。。

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

版權聲明:本文博主原創文章,博客,未經同意不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM