Android:啟動頁--最佳實(shí)踐

一柬帕、前言

Android 開發(fā)過程中啟動頁是必不可少的哟忍,但是我們經(jīng)常會看到啟動打開后是先白屏或者黑屏,然后才會顯示出啟動頁的圖片陷寝,本文會解析此現(xiàn)象的原因锅很,以及給出解決方案

1.1 啟動白屏或黑屏的原因

AndroidManifest.xml中的application標(biāo)簽中設(shè)置了theme,當(dāng)設(shè)置的theme是Light類型時啟動白屏凤跑,當(dāng)設(shè)置theme是Dark類型時啟動黑屏爆安;

1.2 進(jìn)一步分析

當(dāng)系統(tǒng)啟動一個app時,zygote進(jìn)程會fork一個app子進(jìn)程仔引,進(jìn)程創(chuàng)建后在啟動activity時就會創(chuàng)建一個window扔仓,這個window會使用theme中設(shè)置的windowBackground來顯示背景顏色或者圖片,當(dāng)使用LightDark時跟進(jìn)代碼就能看到默認(rèn)設(shè)置的windowBackground就是白色和黑色咖耘。

二翘簇、啟動頁--常規(guī)做法

2.1 創(chuàng)建Activity:SplashActivity

class SplashActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)
        Handler().postDelayed({
            startActivity(Intent(this,MainActivity::class.java))
            finish()
        },3000)
    }
}

2.2 給啟動頁創(chuàng)建background:splash_background.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white"/>
    <item>
        <bitmap android:gravity="center"
                android:src="@drawable/splash_screen"/>
    </item>
</layer-list>

下面重點(diǎn)說下bitmap的屬性功能:

  • android:antialias

    布爾值。啟用或停用抗鋸齒儿倒。

  • android:dither

    布爾值版保。當(dāng)位圖的像素配置與屏幕不同時(例如:ARGB 8888 位圖和 RGB 565 屏幕),啟用或停用位圖抖動夫否。

  • android:filter

    布爾值彻犁。啟用或停用位圖過濾。當(dāng)位圖收縮或拉伸以使其外觀平滑時使用過濾凰慈。

  • android:gravity

    定義位圖的重力汞幢。重力指示當(dāng)位圖小于容器時,可繪制對象在其容器中放置的位置溉瓶。

    必須是以下一個或多個(用 '|' 分隔)常量值:

    說明
    top 將對象放在其容器頂部急鳄,不改變其大小。
    bottom 將對象放在其容器底部堰酿,不改變其大小疾宏。
    left 將對象放在其容器左邊緣,不改變其大小触创。
    right 將對象放在其容器右邊緣坎藐,不改變其大小。
    center_vertical 將對象放在其容器的垂直中心哼绑,不改變其大小岩馍。
    fill_vertical 按需要擴(kuò)展對象的垂直大小,使其完全適應(yīng)其容器抖韩。
    center_horizontal 將對象放在其容器的水平中心蛀恩,不改變其大小。
    fill_horizontal 按需要擴(kuò)展對象的水平大小茂浮,使其完全適應(yīng)其容器双谆。
    center 將對象放在其容器的水平和垂直軸中心,不改變其大小席揽。
    fill 按需要擴(kuò)展對象的垂直大小顽馋,使其完全適應(yīng)其容器。這是默認(rèn)值幌羞。
    clip_vertical 可設(shè)置為讓子元素的上邊緣和/或下邊緣裁剪至其容器邊界的附加選項(xiàng)寸谜。裁剪基于垂直重力:頂部重力裁剪上邊緣,底部重力裁剪下邊緣属桦,任一重力不會同時裁剪兩邊熊痴。
    clip_horizontal 可設(shè)置為讓子元素的左邊和/或右邊裁剪至其容器邊界的附加選項(xiàng)。裁剪基于水平重力:左邊重力裁剪右邊緣地啰,右邊重力裁剪左邊緣愁拭,任一重力不會同時裁剪兩邊。
  • android:mipMap

    布爾值亏吝。啟用或停用 mipmap 提示岭埠。如需了解詳細(xì)信息,請參閱 setHasMipMap()蔚鸥。默認(rèn)值為 false惜论。

  • android:tileMode

    定義平鋪模式。當(dāng)平鋪模式啟用時止喷,位圖會重復(fù)馆类。重力在平鋪模式啟用時將被忽略。

    必須是以下常量值之一:

    說明
    disabled 不平鋪位圖弹谁。這是默認(rèn)值乾巧。
    clamp 當(dāng)著色器繪制范圍超出其原邊界時復(fù)制邊緣顏色
    repeat 水平和垂直重復(fù)著色器的圖像句喜。
    mirror 水平和垂直重復(fù)著色器的圖像,交替鏡像圖像以使相鄰圖像始終相接沟于。

2.3 給啟動頁創(chuàng)建style:SplashTheme

<style name="SplashTheme" parent="AppTheme">
  <item name="windowNoTitle">true</item><!--無標(biāo)題-->
  <item name="android:windowFullscreen">true</item><!--全屏-->
  <item name="android:windowIsTranslucent">true</item><!--半透明-->
  <item name="android:windowBackground">@drawable/splash_background</item>
</style>

2.4 在AndroidManifest.xml中給SplashActivity設(shè)置style

<activity android:name=".SplashActivity"
          android:theme="@style/SplashTheme">
  <intent-filter>
    <action android:name="android.intent.action.MAIN"/>

    <category android:name="android.intent.category.LAUNCHER"/>
  </intent-filter>
</activity>

通過上面的4步設(shè)置就能夠解決打開app白屏或黑屏的問題了咳胃。

三、最佳實(shí)踐

3.1 場景1:只有屏幕中間有一張圖片或者是圖片+文字

通過上面的方式就能實(shí)現(xiàn)旷太,注意bitmap使用gravitycenter讓圖片和文字居中顯示

3.2 場景2:屏幕中部和底部都有圖片或者文字

這種上下布局的展懈,例如微博,可以把圖片切成上下兩個供璧,或者切割圖片上下左右使圖片整體能夠居中顯示

方式一:將圖片切成屏幕中央顯示的圖片和底部圖片

splash_background.xml中就需要換種寫法了

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 整體的背景顏色 -->
    <item>
        <color android:color="@color/white"/>
    </item>
    <!-- 頂部 -->
    <item>
        <bitmap android:gravity="center"
                android:src="@drawable/splash_center"/>
    </item>
    <!-- 底部 -->
    <item>
        <bitmap android:gravity="bottom|center_horizontal"
                android:src="@drawable/splash_bottom"/>
    </item>
</layer-list>

當(dāng)手機(jī)底部虛擬導(dǎo)航欄時存崖,底部圖片會被遮擋,使導(dǎo)航欄透明即可:

class SplashActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)
        Handler().postDelayed({
            startActivity(Intent(this,MainActivity::class.java))
            finish()
        },3000)
    }
}

這句window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)是關(guān)鍵

方式二:將圖片設(shè)置成background而不是windowBackground

  • style設(shè)置:
<style name="SplashTheme" parent="AppTheme">
  <item name="windowNoTitle">true</item>
  <item name="android:windowFullscreen">true</item>
  <item name="android:windowIsTranslucent">true</item>
  <item name="android:windowBackground">@android:color/white</item>
  <item name="android:background">@drawable/splash_background</item>
</style>

用background來設(shè)置背景圖片

  • splash_background.xml設(shè)置:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white"/>
    <item>
        <bitmap android:gravity="clip_vertical|clip_horizontal"
                android:src="@drawable/splash_screen"/>
    </item>
</layer-list>

利用bitmap的gravity屬性睡毒,用clip_vertical|clip_horizontal來裁剪圖片

注意:利用第二種方式時不能使用window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)来惧,這個會導(dǎo)致圖片被拉伸

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市演顾,隨后出現(xiàn)的幾起案子违寞,更是在濱河造成了極大的恐慌,老刑警劉巖偶房,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趁曼,死亡現(xiàn)場離奇詭異,居然都是意外死亡棕洋,警方通過查閱死者的電腦和手機(jī)挡闰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掰盘,“玉大人摄悯,你說我怎么就攤上這事±⒉叮” “怎么了奢驯?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長次绘。 經(jīng)常有香客問我瘪阁,道長,這世上最難降的妖魔是什么邮偎? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任管跺,我火速辦了婚禮,結(jié)果婚禮上禾进,老公的妹妹穿的比我還像新娘豁跑。我一直安慰自己,他們只是感情好泻云,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布艇拍。 她就那樣靜靜地躺著狐蜕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卸夕。 梳的紋絲不亂的頭發(fā)上馏鹤,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音娇哆,去河邊找鬼。 笑死勃救,一個胖子當(dāng)著我的面吹牛碍讨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒙秒,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼勃黍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晕讲?” 一聲冷哼從身側(cè)響起覆获,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓢省,沒想到半個月后弄息,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勤婚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年摹量,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馒胆。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡缨称,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祝迂,到底是詐尸還是另有隱情睦尽,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布型雳,位于F島的核電站当凡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纠俭。R本人自食惡果不足惜宁玫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柑晒。 院中可真熱鬧欧瘪,春花似錦、人聲如沸匙赞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芥被,卻和暖如春欧宜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拴魄。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工冗茸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匹中。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓夏漱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顶捷。 傳聞我的和親對象是個殘疾皇子挂绰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • XML bitmap XML 位圖是在 XML 中定義的資源,指向位圖文件服赎。實(shí)際上是原始位圖文件的別名葵蒂。XML 可...
    李建彪閱讀 1,711評論 0 3
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,089評論 1 32
  • Drawable Resource也即可繪制對象資源,是指可在屏幕上繪制的圖形重虑,以及可以使用getDrawable...
    zivxia閱讀 745評論 0 1
  • 一践付、CSS入門 1、css選擇器 選擇器的作用是“用于確定(選定)要進(jìn)行樣式設(shè)定的標(biāo)簽(元素)”缺厉。 有若干種形式的...
    寵辱不驚丶?xì)q月靜好閱讀 1,584評論 0 6
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color荔仁,font,text-align芽死,li...
    love2013閱讀 2,303評論 0 11