1. 程式人生 > >android AppCompat, splash啟動白屏(黑屏)全屏,去掉狀態列,以及splash與虛擬按鍵遮擋

android AppCompat, splash啟動白屏(黑屏)全屏,去掉狀態列,以及splash與虛擬按鍵遮擋

在做專案是,需要加一個splash,以美化應用,消除app啟動等待的乏味

一、使用環境

        使用Android Studio activity 繼承 AppCompatActivity, 實現splash功能

        測試環境,沒有虛擬返回按鍵的安卓手機和帶有虛擬按鍵的手機,測試虛擬按鍵對splash的影響

二、目標與一般實現

        一般實現splash是新建一個activity,然後在這個acrivity的xml檔案裡設定splash背景,這樣做的效果和沒有加splash的效果一樣,即有黑屏或白屏(看使用的主題而定)

三、實現啟動無白屏(黑屏)

        實現無白屏的原理是,在activity的主題裡設定背景,即用自己的splash圖片代替app啟動時的白屏(預設的啟動背景是白屏或黑屏)程式碼如下:

注:以上這個theme就是完整的配置,直接設定NoTitleFullscreen 為啟動Activity的theme,就會得到完美的splash,程式碼及使用方法如下:

[html] view plain copy print?
  1. <activity  
  2.             android:name=".SplashActivity"  
  3.             android:configChanges="orientation|keyboardHidden|screenSize"  
  4.             android:label="@string/app_name"  
  5.             android:theme="@style/NoTitleFullscreen"  
  6.             >  
  7.             <intent-filter>  
  8.                 <action android:name="android.intent.action.MAIN" />  
  9.                 <category android:name="android.intent.category.LAUNCHER" />  
  10.             </intent-filter>  
  11.         </
    activity>  
<activity
            android:name=".SplashActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:theme="@style/NoTitleFullscreen"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
在values/styles.xml裡面增加主題 [html] view plain copy print?
  1. <!--設定-全屏-->  
  2. <style name="NoTitleFullscreen" parent="AppTheme.NoActionBar">  
  3.     <item name="android:windowNoTitle">true</item>  
  4.     <item name="windowActionBar">false</item>  
  5.     <item name="android:windowFullscreen">true</item>  
  6.     <item name="android:windowContentOverlay">@null</item>  
  7.     <item name="android:windowBackground">@drawable/bg_splash</item>  
  8.     <item name="android:windowIsTranslucent">true</item>  
  9. </style>  
    <!--設定-全屏-->
    <style name="NoTitleFullscreen" parent="AppTheme.NoActionBar">
        <item name="android:windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowBackground">@drawable/bg_splash</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>
其中 [html] view plain copy print?
  1. <item name="android:windowBackground">@drawable/bg_splash</item>  
<item name="android:windowBackground">@drawable/bg_splash</item>
就是指定一幅啟動畫面,代替原來的白屏,從而去除白屏

//其他引數的作用在下面解釋

四、實現在splash隱藏狀態列,以及actionbar

在上面的主題裡面已經包含了設定全屏的引數,再次 列出:

[html] view plain copy print?
  1. <item name="android:windowNoTitle">true</item>  
  2.        <item name="windowActionBar">false</item>  
  3.        <item name="android:windowFullscreen">true</item>  
 <item name="android:windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowFullscreen">true</item>
五、除了設定啟動背景圖,還專門增加一個splashActivity 以實現穩定的啟動效果

從其他部落格可以看到,有的作者建議直接使用如下引數,去掉白屏,並且把此作為啟動splash

[html] view plain copy print?
  1. <item name="android:windowBackground">@drawable/bg_splash</item>  
<item name="android:windowBackground">@drawable/bg_splash</item>

但是實際測試,這樣的啟動會非常的快,一閃而過(這種做,相當與把以前的白屏替代為自己的圖片,白屏是一閃而過)

因此這幾建議專門增設一個activity作為splashActivity,並在splashActivity控制splash時間。

這樣設計之後的效果是:一共有需要設定兩次背景圖片:

第一次:splashActivity通過theme設定的啟動背景 

以下的設定方法:

[html] view plain copy print?
  1. android:theme="@style/NoTitleFullscreen"  
 android:theme="@style/NoTitleFullscreen"
[html] view plain copy print?
  1. <style name="NoTitleFullscreen" parent="AppTheme.NoActionBar">  
  2.         <item name="android:windowBackground">@drawable/bg_splash</item>  
  3.     </style>  
<style name="NoTitleFullscreen" parent="AppTheme.NoActionBar">
        <item name="android:windowBackground">@drawable/bg_splash</item>
    </style>

第二次:splashActivity頁面背景

以下的設定方法:

在SplashActivity的資原始檔activity_splash.xml裡設定:

[html] view plain copy print?
  1. android:background="@drawable/bg_splash"  
android:background="@drawable/bg_splash"

六、在沒有實體按鍵的手機上,虛擬按鍵會遮擋啟動的splash造成顯示不完全

在沒有虛擬按鍵的手機上,這兩個背景顯示能完美對應,顯示正常。
但是在有虛擬按鍵的手機上,虛擬按鍵會影響第一次設定的圖片的正常顯示(圖片被虛擬按鍵遮擋)
針對這個問題在,NoTitleFullscreen裡面增加了如下選項;

[html] view plain copy print?
  1. <item name="android:windowIsTranslucent">true</item>  
<item name="android:windowIsTranslucent">true</item>
從而達到在有虛擬按鍵的的時候,正常顯示

七、新增SplashActivity的延時java程式碼實現

[html] view plain copy print?
  1. public class SplashActivity extends AppCompatActivity {  
  2.     private final Handler mHideHandler = new Handler();  
  3.     private final Runnable gotoPage = new Runnable() {  
  4.         @Override  
  5.         public void run() {  
  6.             Intent mIntent = new Intent(SplashActivity.this, MainActivity.class);  
  7.             startActivity(mIntent);  
  8.             finish();  
  9.         }  
  10.     };  
  11.     @Override  
  12.     protected void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.activity_splash);  
  15.         mHideHandler.postDelayed(gotoPage, 3000);  
  16.     }  
  17. }