天天看點

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,代碼及使用方法如下:

<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裡面增加主題

<!--設定-全屏-->
    <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>
           

其中

<item name="android:windowBackground">@drawable/bg_splash</item>
           

就是指定一幅啟動畫面,代替原來的白屏,進而去除白屏

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

四、實作在splash隐藏狀态欄,以及actionbar

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

<item name="android:windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowFullscreen">true</item>
           

五、除了設定啟動背景圖,還專門增加一個splashActivity 以實作穩定的啟動效果

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

<item name="android:windowBackground">@drawable/bg_splash</item>
           

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

是以這幾建議專門增設一個activity作為splashActivity,并在splashActivity控制splash時間。

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

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

以下的設定方法:

android:theme="@style/NoTitleFullscreen"
           
<style name="NoTitleFullscreen" parent="AppTheme.NoActionBar">
        <item name="android:windowBackground">@drawable/bg_splash</item>
    </style>
           

第二次:splashActivity頁面背景

以下的設定方法:

在SplashActivity的資源檔案activity_splash.xml裡設定:

android:background="@drawable/bg_splash"
           

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

在沒有虛拟按鍵的手機上,這兩個背景顯示能完美對應,顯示正常。

但是在有虛拟按鍵的手機上,虛拟按鍵會影響第一次設定的圖檔的正常顯示(圖檔被虛拟按鍵遮擋)

針對這個問題在,NoTitleFullscreen裡面增加了如下選項;

<item name="android:windowIsTranslucent">true</item>
           

進而達到在有虛拟按鍵的的時候,正常顯示

七、新增SplashActivity的延時java代碼實作

public class SplashActivity extends AppCompatActivity {
    private final Handler mHideHandler = new Handler();
    private final Runnable gotoPage = new Runnable() {
        @Override
        public void run() {
            Intent mIntent = new Intent(SplashActivity.this, MainActivity.class);
            startActivity(mIntent);
            finish();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_splash);
        mHideHandler.postDelayed(gotoPage, 3000);
    }
}