問題現象
為了防止在app啟動時出現黑屏或者白屏問題。需要選擇冷啟動處理。實現方式如下:
在styles文件中添加自定義主題:
<style name="ThemeSplash" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:background">@drawable/bg_welcome_default</item> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style>
在Manifest文件中使用主題:
<application android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true"> <activity android:theme="@style/ThemeSplash" android:name=".SplashActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
在app中的bg_welcome_default圖片的大小有三個640 * 960,750 * 1334,1242 * 2208。
在相匹配寬高比的手機可以正常顯示,會在類似小米9(1080 * 2340)會出現拉伸情況。(注意:在這里不能使用寬高比為1080 * 2340 的替換 1242 * 2208 的圖片。因為相同像素密度下寬高比為1242 * 2208 的手機也會存在拉伸,這樣替換不能解決根本問題。)
問題原因
在使用圖片作為全屏圖片時屏幕的寬高比和圖片的寬高比不匹配。
解決方法
圖標使用單獨切圖,背景自定義繪制,代碼如下:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape > <solid android:color="@color/white"/> </shape> </item> <item android:left="10dip" android:top="10dip"> <bitmap android:src="@drawable/bg_welcome" android:gravity="center"/> </item> </layer-list>
引申問題
經過上面方法的處理,Splash界面拉伸問題已經解決,但是還有一個小問題,就是小米9的statusBar沒有被圖片填充。經過道長排查,自定義主題代碼可以使用如下代碼:
<style name="ThemeSplash" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowBackground">@drawable/bg_welcome_default</item> <item name="android:statusBarColor">@android:color/transparent</item> <!--<item name="android:windowNoTitle">true</item>--> <!--<item name="android:windowFullscreen">true</item>--> <!--<item name="windowActionBar">false</item>--> <!--<item name="windowNoTitle">true</item>--> </style>
注意:這個主題是放在v21\styles.xml中,和上面的代碼不沖突。
到這里,冷啟動狀態下Splash界面拉伸問題基本就解決了。