Android全面屏啟動頁適配的一些坑

RmondJone發表於2018-07-06

全面屏適配的坑

1、關於全面屏適配的一些基本知識點

我所以寫這篇文章是因為這個坑一般人不一定能發現,在解決過程中也百度了很多資料,都沒有找到答案,最後是我機緣巧合解決掉了,其中的原理知識大致理解不一定深。網上關於全面屏適配的資料有很多,這裡給大家介紹一個。大家自己去看:https://blog.csdn.net/guolin_blog/article/details/51763825

2、坑

很多人也許和我一樣就是在應用啟動特別慢的情況下(Application耗時時間比較長),會用一張圖片應用到啟動Activity的Theme上,就像下面這樣,來達到一點應用圖示及開啟應用的效果,不會出現白屏和黑屏的現象。網上說是冷啟動優化,其實就是自己騙自己,治標不治本的方法。

<application
        android:name=".App"
        android:largeHeap="true"
        android:hardwareAccelerated="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:theme="@style/MainTheme"
            android:windowSoftInputMode="adjustPan"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--region 適配全面屏-->
        <meta-data
            android:name="android.max_aspect"
            android:value="2.4" />
        <!--endregion-->
    </application>
複製程式碼
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MainTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:navigationBarColor">@android:color/transparent</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowBackground">@mipmap/iv_startup</item>
    </style>
</resources>
複製程式碼

乍一看這麼寫完全沒有問題,android:windowTranslucentNavigation和android:windowTranslucentStatus都設定為true之後,android:navigationBarColor和android:statusBarColor設定為透明之後,就應該只展現圖片了啊,不會有啥狀態列和導航欄。

Android全面屏啟動頁適配的一些坑
而實際展現出來的啟動頁效果是這樣的,虛擬按鈕背景照樣是淺灰色。

Android全面屏啟動頁適配的一些坑

網上查的那些資料說什麼在Activity裡onCreate()、onWindowFocusChanged()或者在Application裡設定ActivityLifecycleCallbacks監聽,然後在onActivityCreated()用程式碼設定沉浸式效果,隱藏狀態列和導航欄。這個我想說,根本不適用我這個場景,這個是啟動圖,Application的onCreate()都沒有走完,這個圖片就已經展現出來了,程式碼控制壓根沒用。
還有的資料說是新增這行程式碼

<item name="android:fitsSystemWindows">true</item>
複製程式碼

還有資料說應用這個樣式

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MainTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">false</item>
        <item name="android:windowBackground">@mipmap/iv_startup</item>
    </style>
</resources>
複製程式碼

第一個壓根沒有用,在剛啟動的時候和上圖一樣的效果虛擬導航鍵是淺灰色的,然後走進啟動Activity之後,圖片完全就被頂上去了,讓出了底部虛擬按鈕的區域,都被擠變形了。


第二個設定了壓根沒有用,android:windowDrawsSystemBarBackgrounds這個屬性如果設定為true,那麼圖片不會被壓縮比例,但是會被虛擬導航鍵擋住。可以理解為虛擬導航鍵佈局浮動在啟動圖上,啟動圖全屏充滿。並且虛擬導航欄使用的是預設樣式。

Android全面屏啟動頁適配的一些坑
如果設定為false,則圖片會被展示全部,但是圖片會避開虛擬導航鍵那部分割槽域不會全屏充滿,會被壓縮比例展示,這個也是預設屬性。如果沒有虛擬導航欄那其實就能滿足我的要求,但是有的全面屏機型虛擬導航欄是自己設定的,小米手機設定-全面屏-切換,而這個導航鍵如果不做處理,應用裡是一直存在的。

Android全面屏啟動頁適配的一些坑


這個就很坑了,坑在哪裡?在這一行

<item name="android:windowTranslucentNavigation">true</item>
<item name="android:windowTranslucentStatus">true</item>
複製程式碼

對罪魁元首就是這2行,我是怎麼解決這個問題的,很簡單。把這2行刪掉就行了。就是應用下面的樣式:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="MainTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:navigationBarColor">@android:color/transparent</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
        <!--windowTranslucentNavigation這個屬性設定成true,則navigationBarColor設定會失效-->
        <!--<item name="android:windowTranslucentNavigation">true</item>-->
        <!--<item name="android:windowTranslucentStatus">true</item>-->
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowBackground">@mipmap/iv_startup</item>
    </style>
</resources>
複製程式碼

原因是什麼?就是Android如果設定過android:windowTranslucentNavigation和android:windowTranslucentStatus為true之後,android:navigationBarColor和android:statusBarColor都不會生效,預設使用Android自帶的樣式,我的模擬器表現就是淺灰色。


以上都看完之後,相信大家大致明白了該怎麼去適配冷啟動圖片設定android:navigationBarColor不起效果的BUG,但是還有一個就是大家,一定要注意,這也是網上全面屏教程都沒有涉及到的知識點,就是targetSdkVersion一點要大於等於21,否則你讓應用怎麼去適配全面屏和沉浸式所屬的樣式???

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.foutch.xyz.myapplication"
        minSdkVersion 16
        //targetSdkVersion需要>=21,要不然應用不了V21版本的樣式
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
複製程式碼

DEMO連結: https://pan.baidu.com/s/1_byrlvhEbOHPFUQslZ62SQ
密碼: d3rb

3、關於作者

掘金:juejin.im/user/5a2b6b…

簡書:www.jianshu.com/u/7566e4604…

GitHub:github.com/RmondJone

微信圖片_20181024114409.jpg
微信圖片_20181024114416.jpg

相關文章