Android沉浸式狀態(tài)欄

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處+地址

hello,大家好~第一次在簡(jiǎn)書上發(fā)表文章鼎天,如果有什么不對(duì)的地方,大家留言指正蔚叨。

Android 沉浸式狀態(tài)欄 已經(jīng)算是出來比較久的技術(shù)了载绿,只不過我們公司項(xiàng)目最近要優(yōu)化一下UI粥诫,就研究了一下,在此特別感謝簡(jiǎn)書作者揚(yáng)州慢_提供的解決方案崭庸,原文鏈接戳這里怀浆。

言歸正傳,Android沉浸式分為以下幾個(gè)維度去處理

1.API < 19(無法進(jìn)行沉浸式)

2.API = 19(添加與狀態(tài)欄同等寬高的View)

3.API > 19? ?(設(shè)置狀態(tài)欄顏色) 「 API > 22 可以修改狀態(tài)欄的字體和圖標(biāo)顏色冀自,避免因設(shè)置顏色相近看不清狀態(tài)欄原有的字體」

接下來逐條闡明具體解決方案,

(獲取狀態(tài)欄高度以及獲取actionbar的高度的函數(shù)會(huì)在最后給出秒啦,大家先看懂原理)

首先熬粗,對(duì)于API < 19(即安卓4.4系統(tǒng)以下)的沒辦法做處理,而且市場(chǎng)占有率很低余境,可以忽略驻呐;

其次,對(duì)于API = 19(即安卓4.4系統(tǒng))芳来,核心代碼如下:

兩種情況處理:1.有ActionBar(直接調(diào)用系統(tǒng)的才算含末,toolbar不算在這個(gè)分類里面)

? ? ? ? ? ? ? ? ? ? ? ? ?2.沒有ActionBar

//增加占位狀態(tài)欄

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

View statusBarView = new View(activity);

//為statusBarView準(zhǔn)備的布局參數(shù),全屏寬即舌,與狀態(tài)欄一樣的高度

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));

ViewGroup rootView = mActivity.findViewById(android.R.id.content);

//通過外面設(shè)置是否有actionbar

if (isActionBar()) {

//要增加內(nèi)容視圖的 paddingTop,否則內(nèi)容被 ActionBar 遮蓋

rootView.setPadding(0, getStatusBarHeight(mActivity) + getActionBarHeight(mActivity), 0, 0);

} else {

rootView.setPadding(0, getStatusBarHeight(mActivity), 0, 0);

}

//為占位狀態(tài)欄設(shè)置我們想要的顏色

statusBarView.setBackgroundColor(color);

//為DecorView添加占位狀態(tài)欄

decorView.addView(statusBarView, lp);

以上是代碼邏輯的闡述佣盒,接下來就是針對(duì)API = 19的style的特殊處理(文件路徑 values-v19/styles.xml)

//為你的app的主題加入以下兩個(gè)item

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

<item name="android:windowTranslucentNavigation">false</item>

那么這兩個(gè)屬性是用來干什么的呢?(后續(xù)補(bǔ)充)

最后顽聂,對(duì)于 API > 19(即安卓5.0及以上)肥惭,核心代碼如下:

//直接設(shè)置狀態(tài)欄顏色

Window window = mActivity.getWindow();

//取消設(shè)置透明狀態(tài)欄,使 ContentView 內(nèi)容不再沉浸到狀態(tài)欄下

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

//需要設(shè)置這個(gè) flag 才能調(diào)用 setStatusBarColor 來設(shè)置狀態(tài)欄顏色

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

activity.getWindow().setStatusBarColor(color);

補(bǔ)充,對(duì)于 API > 22(即安卓6.0及以上)紊搪,設(shè)置狀態(tài)欄的字體顏色蜜葱,核心代碼如下:

/** * 設(shè)置狀態(tài)欄文字顏色 bDark為TRUE代表沉浸式 */

private static void setStatusBarMode(Activity activity, boolean bDark) {

? ? //6.0以上

? ? if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

? ? ? ? View decorView = activity.getWindow().getDecorView();

? ? ? ? if (decorView != null) {

? ? ? ? ? ? ? int vis = decorView.getSystemUiVisibility();

? ? ? ? ? ? ? if (bDark) {

????????????????vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;

????????????????} else {

????????????????vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;

????????????????}

????????decorView.setSystemUiVisibility(vis);

????????}

????}

}

什么原理呢:?耀石?牵囤??(后續(xù)補(bǔ)充)

getStatusBarHeight獲取狀態(tài)欄高度的函數(shù)如下:

/** * 利用反射獲取狀態(tài)欄高度 */

private static int getStatusBarHeight(Activity activity) {

????????int result = 0; //獲取狀態(tài)欄高度的資源id

????????int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");

????????if (resourceId > 0) {

????????????result = activity.getResources().getDimensionPixelSize(resourceId);

? ? ? ?}

????????Log.e("getStatusBarHeight", result + "");

????????return result;

}

getActionBarHeight獲取ActionBar高度的函數(shù)如下:

/** * 獲得 ActionBar 的高度 */

public static int getActionBarHeight(Context context) {

????????int result = 0;

????????if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {

? ? ? ? ? ? ? ? TypedValue tv = new TypedValue();

????????????????//劃重點(diǎn)V臀啊=伊邸!0鹉巍P阼搿!之前在4.4手機(jī)上出現(xiàn)了部分UI會(huì)被遮住一點(diǎn)點(diǎn)就是在這里出的問題鉴裹,一定要看你的actionbar用的是哪個(gè)包里面的舞骆,不同包下面大小有些差異

????????????????context.getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize, tv, true);

????????????????result = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());

????????}

return result;

}

在設(shè)置沉浸式的同時(shí)钥弯,我們要對(duì)actionbar做去除陰影處理,代碼如下:

/*** 去除 ActionBar 陰影 */

public void clearActionBarShadow() {

????????if (Build.VERSION.SDK_INT >= 21) {

????????????????ActionBar supportActionBar = ((AppCompatActivity) mActivity).getSupportActionBar();

????????????????if (supportActionBar != null) {

????????????????????????supportActionBar.setElevation(0);

? ? ? ? ? ? ? ? }

????????}

????????return this;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末督禽,一起剝皮案震驚了整個(gè)濱河市脆霎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狈惫,老刑警劉巖睛蛛,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胧谈,居然都是意外死亡忆肾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門菱肖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來客冈,“玉大人,你說我怎么就攤上這事稳强〕≈伲” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵退疫,是天一觀的道長(zhǎng)渠缕。 經(jīng)常有香客問我,道長(zhǎng)褒繁,這世上最難降的妖魔是什么亦鳞? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮棒坏,結(jié)果婚禮上蚜迅,老公的妹妹穿的比我還像新娘。我一直安慰自己俊抵,他們只是感情好谁不,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徽诲,像睡著了一般刹帕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谎替,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天偷溺,我揣著相機(jī)與錄音,去河邊找鬼钱贯。 笑死挫掏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秩命。 我是一名探鬼主播尉共,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼褒傅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了袄友?” 一聲冷哼從身側(cè)響起殿托,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剧蚣,沒想到半個(gè)月后支竹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸠按,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年礼搁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片目尖。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馒吴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卑雁,到底是詐尸還是另有隱情募书,我是刑警寧澤绪囱,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布测蹲,位于F島的核電站,受9級(jí)特大地震影響鬼吵,放射性物質(zhì)發(fā)生泄漏扣甲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一齿椅、第九天 我趴在偏房一處隱蔽的房頂上張望琉挖。 院中可真熱鬧,春花似錦涣脚、人聲如沸示辈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矾麻。三九已至,卻和暖如春芭梯,著一層夾襖步出監(jiān)牢的瞬間险耀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工玖喘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甩牺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓累奈,卻偏偏與公主長(zhǎng)得像贬派,于是被迫代替她去往敵國(guó)和親急但。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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