為什么會有黑白屏
在桌面點擊應用圖標后胀滚,在app進程沒有創(chuàng)建的情況下,需要時間創(chuàng)建app進程,初始化資源杨何,以及啟動首頁Activity的(這里討論的首頁是指AndroidManifest里面標志的啟動頁)盗似,這就意味點擊圖標不能馬上看到啟動頁哩陕。為了不讓用戶有卡頓的感覺,谷歌有了Preview Window赫舒,在啟動頁沒有繪制完成時悍及,會先初始化一個Window,我們通辰影看到的黑屏或白屏心赶,就是這個預覽窗口。
怎么知道是黑屏還是白屏缺猛?
黑白屏是預加載的窗口缨叫,這個窗口的一些屬性可以在theme里更改椭符。新建一個項目,會在AndroidManifest的application所屬標簽里面的內(nèi)容看到android:theme="@style/AppTheme"
,這個是默認的theme耻姥。查看這個AppTheme,找到name="android:windowBackground"
這個屬性销钝,查看屬性下的內(nèi)容,就能知道是黑屏還是白屏琐簇,這個屬性就是設置預覽窗口的背景蒸健。無論是黑屏還是白屏,給用戶的體驗都不好鸽嫂,所以就有了把背景設為透明或者用一張圖片來作為啟動背景的解決辦法纵装。這些只是很基本的解決辦法,而且存在一定的弊端据某,既然我們要讓用戶體驗更好橡娄,就應該處理得更加優(yōu)雅一些。
如何優(yōu)雅的解決黑白屏
解決黑白屏癣籽,需要和啟動頁結(jié)合起來⊥彀Γ現(xiàn)在的APP基本上都有閃屏頁,有些是為了加載廣告筷狼,有些是為了通過閃屏頁初始化App的一些資源瓶籽,本篇文章就討論有閃屏的啟動頁,以網(wǎng)易云音樂對預加載窗口和閃屏頁的處理來舉例埂材。來看看網(wǎng)易云的預加載頁和啟動頁塑顺。
第一張是預加載頁,第二張是閃屏頁俏险,閃屏頁只比預加載頁多了底部的圖標和網(wǎng)易云音樂這四個字(其實是一整體严拒,一張圖片),而且給人的感覺是一直是預加載頁竖独,不過底部的圖標和文字會慢慢出現(xiàn)裤唠,這樣的處理比單獨的顯示圖片或者設置為透明更讓人能夠接受。下面我們就來看看代碼莹痢。
styles文件自定義Theme
<style name="AppTheme.lanuchTheme" >
<item name="android:windowBackground">@drawable/launch_layout</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
launch_layout种蘸,代碼中的top_img,是“音樂的力量”四個字的圖片竞膳。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/holo_red_dark"/>
<item android:top="150dp">
<bitmap android:gravity="top" android:src="@mipmap/top_img" />
</item>
</layer-list>
SplashActivity的布局文件為
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/bottom_imag"http://bottom_imag為底部的圖標和文字
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="50dp"
/>
</RelativeLayout>
最后在AndroidManifest里將lanuchTheme設置給閃屏頁(下文用SplashActivity表示)航瞭,就大功告成了。
寫以上布局需要注意:由于沒有給SplashActivity的布局設置背景色坦辟,也就是透明色沧奴,而兩個頁面的區(qū)別只有底部加了一張圖片,所以在SplashActivity的布局中就不需要再把預加載頁的內(nèi)容再寫一次长窄。
總結(jié)
黑白屏的解決是為了讓用戶覺得點擊圖標就得到了響應滔吠,App啟動很順暢纲菌,這個過程能在視覺上給人美感,那就更好了疮绷。不同的應用場景可以有不同的解決辦法翰舌,不一定是有閃屏頁,也不一定要和網(wǎng)易云音樂一樣冬骚,也可以在閃屏頁寫一個動畫或其它效果椅贱。想弄懂黑白屏,可以先做做以下功課
- 本篇網(wǎng)易云音樂解決方案的原理
- 明白為什么自定義theme,并且單獨設置給Activity
- 了解layer_list可以做什么
弄明白這幾個問題只冻,解決黑白屏就不是什么難事了庇麦。
最后對于程序員來說,要學習的知識內(nèi)容喜德、技術有太多太多山橄,要想不被環(huán)境淘汰就只有不斷提升自己,從來都是我們?nèi)ミm應環(huán)境舍悯,而不是環(huán)境來適應我們航棱!
這里附上上述的技術體系圖相關的幾十套騰訊、頭條萌衬、阿里饮醇、美團等公司19年的面試題,把技術點整理成了視頻和PDF(實際上比預期多花了不少精力)秕豫,包含知識脈絡 + 諸多細節(jié)朴艰,由于篇幅有限,這里以圖片的形式給大家展示一部分混移。
相信它會給大家?guī)砗芏嗍斋@:
上述【高清技術腦圖】以及【配套的架構(gòu)技術PDF】可以 關注我 【主頁簡介】 或者【簡信】免費獲取
當程序員容易祠墅,當一個優(yōu)秀的程序員是需要不斷學習的,從初級程序員到高級程序員沫屡,從初級架構(gòu)師到資深架構(gòu)師,或者走向管理撮珠,從技術經(jīng)理到技術總監(jiān)沮脖,每個階段都需要掌握不同的能力。早早確定自己的職業(yè)方向芯急,才能在工作和能力提升中甩開同齡人