App啟動時白屏&使用BitmapDrawable解決啟動頁背景圖片拉伸
一,App啟動時,會白屏或者黑屏,採用如下方法解決:
1.啟動頁的Activity設定style
<activity android:name=".activity.SplashActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:theme="@style/Theme.Start"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
2. Activity樣式 Theme.Start 程式碼如下:
<style name="Theme.Start" parent="Theme.AppCompat.Light.NoActionBar"> <!--設定背景顏色--> <item name="android:background">@drawable/splash</item> <!-- 隱藏標題欄 --> <item name="windowNoTitle">true</item> <!-- 隱藏狀態列 --> <item name="android:windowFullscreen">true</item> </style>
問題:如果沒有啟動頁Activity,給Application設定background是不是也可以去掉白屏呢?
二,BitmapDrawable解決啟動頁背景圖片拉伸
上面的background屬性為一張啟動頁圖片,發現在pad上顯示啟動頁的圖片會拉伸變形。ImageView可以通過ScaleType屬性設定圖片src的縮放模式,可惜activity的background沒有類似設定縮放模式屬性。
但是我們可以從圖片下手(一開始使用.9圖片,但是小米pad(android4.4.4)上splash頁面就縮小了,不知道為什麼,可能哪裡操作有誤或者不相容。)使用BitmapDrawable,對原來的圖片進行包裝,來解決圖片拉伸問題。
程式碼如下 splash_bg.xml:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:gravity="clip_horizontal|clip_vertical"
android:dither="true"
android:src="@drawable/splash"
android:tileMode="disabled"/>
<!--屬性解釋-->
<!--android:src 圖片資源id-->
<!--android:antialias是否開啟抗鋸齒,應該開啟-->
<!--android:dither是否開啟抖動效果,應該開啟-->
<!--android:filter是否開啟過濾效果,應該開啟-->
<!--android:gravity對圖片進行定位-->
<!--android:mipMap紋理對映,一般為false-->
<!--android:tileMode平鋪模式四個值:disabled(預設值即關閉平鋪模式)、clamp、repeat、mirror-->
將Theme.Start的background屬性值改為splash_bg。
注意:背景圖片splash_bg設定給background屬性後,需要再給windowBackground設定為圖片的底色。因為背景圖片splash_bg是多大顯示多大,不會拉伸,周圍未填充的區域會是有白色或黑色。
修改後的Theme.Start,程式碼如下:
<style name="Theme.Start" parent="Theme.AppCompat.Light.NoActionBar">
<!-- 設定整個window窗體的背景顏色,為圖片的底色,因為圖片居中,圖片未覆蓋的區域會是白色-->
<item name="android:windowBackground">@color/splash_blue</item>
<!--設定背景顏色-->
<item name="android:background">@drawable/splash_bg</item>
<!-- 隱藏標題欄 -->
<item name="windowNoTitle">true</item>
<!-- 隱藏狀態列 -->
<item name="android:windowFullscreen">true</item>
</style>
缺點:在pad上,原來是啟動時背景圖片拉伸變形了,感覺不是很好。現在使用BitmapDrawable後,圖片會保持自身大小不變。不會變形。但是同一張背景圖,在手機上看挺好的;在大螢幕pad上,顯得很小,感覺也不是很好。
<item name="android:background">@drawable/splash</item> splash是原圖片,拉伸變形。
<item name="android:background">@drawable/splash_bg</item> splash_bg是BitmapDrawable,保持自身大小不變。
問:有沒有辦法像ios那樣,手機和pad使用不同的啟動圖呢?
關於適配:dimen是根據裝置的畫素密度改變控制元件實際px值,這裡通過background屬性設定的背景圖片,大小相當於是match_parent,沒辦法指定大小,怎麼辦? :(