關(guān)于沉浸式狀態(tài)欄的探索


?????? 在這個(gè)行業(yè)上班1年零2個(gè)月了,一直都沒(méi)有好好的總結(jié)在這個(gè)行業(yè)的技術(shù)能力瞻鹏,為了好好的練就自己的技術(shù),也為了各位網(wǎng)友鹿寨,以互利共贏的態(tài)度新博,來(lái)好好的維護(hù)博客(*^__^*)


??????? 前段時(shí)間被一個(gè)狀態(tài)欄的問(wèn)題困擾了下,在4.4的手機(jī)上能設(shè)置狀態(tài)欄脚草,但在7.0的手機(jī)上面卻設(shè)置不了了赫悄,雖然經(jīng)過(guò)一番百度,把問(wèn)題給解決了,但只停留在吧問(wèn)題解決了埂淮,沒(méi)有看看到底是什么原因姑隅,于是記錄一下?tīng)顟B(tài)欄的問(wèn)題,以后如果遇到了倔撞,也能快速的解決讲仰。

狀態(tài)欄介紹:

狀態(tài)欄在4.4之前是沒(méi)有的,在4.4(API19)到5.0(API21)痪蝇,通過(guò)設(shè)置FLAG_TRANSLUCENT_STATUS鄙陡,并添加和StatusBar一樣高度的View才能實(shí)現(xiàn)沉浸式的狀態(tài)欄,否則躏啰,內(nèi)容會(huì)跑到狀態(tài)欄上去(如果要這種效果那就讓他跑吧(*^__^*) 嘻嘻……)趁矾。

但在5.0(API21)之后,出現(xiàn)了設(shè)置狀態(tài)欄顏色的接口给僵,直接設(shè)置就可以了毫捣,先介紹到這里,下面我來(lái)一步一步的分析帝际,扒開(kāi)他所謂的面紗培漏。

先在4.4的手機(jī)上試驗(yàn):

當(dāng)在java中添加:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

或者在theme中加屬性(在values-v19 中添加):

<item name="android:windowTranslucentStatus">true</item

效果:

當(dāng)然,想要這種效果也不錯(cuò)


但加如下代碼(在StatusBar上添加View):

//獲取windowphone下的decorView

ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();

intcount? ? = decorView.getChildCount();

//判斷是否已經(jīng)添加了statusBarView

//? ? ? ? if (count > 0 && decorView.getChildAt(count - 1) instanceof StatusBarView) {

//? ? ? ? ? ? decorView.getChildAt(count - 1).setBackgroundColor(calculateStatusColor(color, statusBarAlpha));

//? ? ? ? } else {

//新建一個(gè)和狀態(tài)欄高寬的view

View statusView =createStatusBarView(activity,color,alpha);

decorView.addView(statusView);

//? ? ? ? }

ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);

//rootview不會(huì)為狀態(tài)欄留出狀態(tài)欄空間

ViewCompat.setFitsSystemWindows(rootView,true);

rootView.setClipToPadding(true);

private staticViewcreateStatusBarView(Activity activity, intcolor, intalpha) {

// 繪制一個(gè)和狀態(tài)欄一樣高的矩形

View statusBarView =newView(activity);

LinearLayout.LayoutParams params =

newLinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusBarHeight(activity));

statusBarView.setLayoutParams(params);

statusBarView.setBackgroundColor(color);

return statusBarView;

}

private static intgetStatusBarHeight(Context context) {

// 獲得狀態(tài)欄高度

intresourceId = context.getResources().getIdentifier("status_bar_height","dimen","android");

return context.getResources().getDimensionPixelSize(resourceId);

}


內(nèi)容正常顯示

在7.1手機(jī)上試驗(yàn):

由于在5.0以后胡本,能更容易的修改狀態(tài)欄牌柄,setStatusBarColor()可設(shè)置狀態(tài)欄顏色,對(duì)應(yīng)的在主題中修改是android:statusBarColor(values-v21)

/**

* Sets the color of the status bar to {@codecolor}.

*

* For this to take effect,

* the window must be drawing the system bar backgrounds with

* {@linkandroid.view.WindowManager.LayoutParams#FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS} and

* {@linkandroid.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_STATUS} must not be set.

*

* If {@codecolor} is not opaque, consider setting

* {@linkandroid.view.View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and

* {@linkandroid.view.View#SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}.

*

* The transitionName for the view background will be "android:status:background".

*

*/

public abstract voidsetStatusBarColor(@ColorIntintcolor);

意思是必須要設(shè)置FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS侧甫,并且去掉FLAG_TRANSLUCENT_STATUS珊佣,按他的意思在7.1的手機(jī)上看下效果


但要鋪滿(mǎn)呢,只需要添加FLAG_TRANSLUCENT_STATUS就可以了披粟,效果:


總結(jié):

沉浸式狀態(tài)欄就是這么簡(jiǎn)單咒锻,只需要靜下心來(lái),分析下各種情況守屉,有時(shí)看別人這么寫(xiě)惑艇,很納悶,但看下源碼拇泛,原來(lái)滨巴,源碼里的注釋就說(shuō)明了,必須要這么做俺叭,所以恭取,看源碼很有必要!后續(xù)熄守,我會(huì)做一個(gè)工具包蜈垮,方便大家使用耗跛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市攒发,隨后出現(xiàn)的幾起案子调塌,更是在濱河造成了極大的恐慌,老刑警劉巖惠猿,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烟阐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡紊扬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)唉擂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)餐屎,“玉大人,你說(shuō)我怎么就攤上這事玩祟「顾酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵空扎,是天一觀的道長(zhǎng)藏鹊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)转锈,這世上最難降的妖魔是什么盘寡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮撮慨,結(jié)果婚禮上竿痰,老公的妹妹穿的比我還像新娘。我一直安慰自己砌溺,他們只是感情好影涉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著规伐,像睡著了一般蟹倾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猖闪,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天鲜棠,我揣著相機(jī)與錄音,去河邊找鬼培慌。 笑死岔留,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的检柬。 我是一名探鬼主播献联,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼竖配,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了里逆?” 一聲冷哼從身側(cè)響起进胯,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎原押,沒(méi)想到半個(gè)月后胁镐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诸衔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年盯漂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笨农。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡就缆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谒亦,到底是詐尸還是另有隱情竭宰,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布份招,位于F島的核電站切揭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏锁摔。R本人自食惡果不足惜廓旬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谐腰。 院中可真熱鬧嗤谚,春花似錦、人聲如沸怔蚌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桦踊。三九已至椅野,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間籍胯,已是汗流浹背竟闪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杖狼,地道東北人炼蛤。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蝶涩,于是被迫代替她去往敵國(guó)和親理朋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子絮识,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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