全面屏適配的坑
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設定為透明之後,就應該只展現圖片了啊,不會有啥狀態列和導航欄。
而實際展現出來的啟動頁效果是這樣的,虛擬按鈕背景照樣是淺灰色。網上查的那些資料說什麼在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,那麼圖片不會被壓縮比例,但是會被虛擬導航鍵擋住。可以理解為虛擬導航鍵佈局浮動在啟動圖上,啟動圖全屏充滿。並且虛擬導航欄使用的是預設樣式。
這個就很坑了,坑在哪裡?在這一行
<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、關於作者
簡書:www.jianshu.com/u/7566e4604…
GitHub:github.com/RmondJone