1. 程式人生 > >App啟動時白屏&使用BitmapDrawable解決啟動頁背景圖片拉伸

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,沒辦法指定大小,怎麼辦? :(