全面屏適配的坑
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,那么圖片不會被壓縮比例,但是會被虛擬導航鍵擋住??梢岳斫鉃樘摂M導航鍵布局浮動在啟動圖上,啟動圖全屏充滿。并且虛擬導航欄使用的是默認樣式。
如果設置為false,則圖片會被展示全部,但是圖片會避開虛擬導航鍵那部分區域不會全屏充滿,會被壓縮比例展示,這個也是默認屬性。如果沒有虛擬導航欄那其實就能滿足我的要求,但是有的全面屏機型虛擬導航欄是自己設置的,小米手機設置-全面屏-切換,而這個導航鍵如果不做處理,應用里是一直存在的。
這個就很坑了,坑在哪里?在這一行
<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、關于作者
掘金:https://juejin.im/user/5a2b6b306fb9a04522076dd0/posts
簡書:http://www.lxweimin.com/u/7566e4604f87
GitHub:https://github.com/RmondJone