沉浸式狀態(tài)欄

網(wǎng)上的沉浸式狀態(tài)欄有很多方式扔罪,總結(jié)一下,進(jìn)行備份學(xué)習(xí)劲妙。

關(guān)于沉浸式大概可以分成三個(gè)階段:

Android4.4(API 19) - Android 5.0(API 21): 這個(gè)階段可以實(shí)現(xiàn)沉浸式,但是表現(xiàn)得還不是很好,實(shí)現(xiàn)方式為: 通過FLAG_TRANSLUCENT_STATUS設(shè)置狀態(tài)欄為透明并且為全屏模式读拆,然后通過添加一個(gè)與StatusBar 一樣大小的View,將View 的 background 設(shè)置為我們想要的顏色鸵闪,從而來實(shí)現(xiàn)沉浸式檐晕。

Android 5.0(API 21)以上版本: 在Android 5.0的時(shí)候,加入了一個(gè)重要的屬性和方法 android:statusBarColor (對(duì)應(yīng)方法為 setStatusBarColor)蚌讼,通過這個(gè)方法我們就可以輕松實(shí)現(xiàn)沉浸式辟灰。也就是說,從Android5.0開始篡石,系統(tǒng)才真正的支持沉浸式芥喇。

Android 6.0(API 23)以上版本:其實(shí)Android6.0以上的實(shí)現(xiàn)方式和Android 5.0 +是一樣,為什么要將它歸為一個(gè)單獨(dú)重要的階段呢凰萨?是因?yàn)閺腁ndroid 6.0(API 23)開始继控,我們可以改狀態(tài)欄的繪制模式械馆,可以顯示白色或淺黑色的內(nèi)容和圖標(biāo)(除了魅族手機(jī),魅族自家有做源碼更改武通,6.0以下就能實(shí)現(xiàn))

一些基礎(chǔ)的代碼可如下所示:

1狱杰、首先在xml的根節(jié)點(diǎn)下加入添加屬性android:fitsSystemWindows="true"

android:fitsSystemWindows這個(gè)屬性,主要是通過調(diào)整當(dāng)前設(shè)置這個(gè)屬性的view的padding去為我們的status_bar留下空間厅须。

2仿畸、代碼布局:

if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.LOLLIPOP) {
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
  getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  getWindow().setStatusBarColor(Color.BLUE);
}
else if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) {
  //透明狀態(tài)欄
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  //透明導(dǎo)航欄
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

之后還想說的是,如果狀態(tài)欄為白色或者淺色系朗和,很難看清错沽,這就需要我們讓狀態(tài)欄的顏色變黑色,在android里的6.0之后可以設(shè)置眶拉,在android6.0以前則是不可以的千埃。

/**
* 設(shè)置狀態(tài)欄黑色字體圖標(biāo),
* 適配4.4以上版本MIUIV忆植、Flyme和6.0以上版本其他Android
*
*@paramactivity
*@return1:MIUUI 2:Flyme 3:android6.0
*/

public static intStatusBarLightMode(Activity activity) {
  int result =0;
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) {
if(MIUISetStatusBarLightMode(activity.getWindow(),true)) {
  result =1;
}else if(FlymeSetStatusBarLightMode(activity.getWindow(),true)) {
  result =2;
}else if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M) {
  activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
  result =3;
}
}
return result;
}

/**
* 已知系統(tǒng)類型時(shí)放可,設(shè)置狀態(tài)欄黑色字體圖標(biāo)。
* 適配4.4以上版本MIUIV朝刊、Flyme和6.0以上版本其他Android
*
*@paramactivity
*@paramtype1:MIUUI 2:Flyme 3:android6.0
*/

public static voidStatusBarLightMode(Activity activity,inttype) {
if(type ==1) {
  MIUISetStatusBarLightMode(activity.getWindow(),true);
}else if(type ==2) {
  FlymeSetStatusBarLightMode(activity.getWindow(),true);
}else if(type ==3) {
  activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}

/**
* 清除MIUI或flyme或6.0以上版本狀態(tài)欄黑色字體
*/

public static voidStatusBarDarkMode(Activity activity,inttype) {
if(type ==1) {
  MIUISetStatusBarLightMode(activity.getWindow(),false);
}else if(type ==2) {
  FlymeSetStatusBarLightMode(activity.getWindow(),false);
}else if(type ==3) {
  activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}
}

/**
* 設(shè)置狀態(tài)欄圖標(biāo)為深色和魅族特定的文字風(fēng)格
* 可以用來判斷是否為Flyme用戶
*@paramwindow需要設(shè)置的窗口
*@paramdark是否把狀態(tài)欄字體及圖標(biāo)顏色設(shè)置為深色
*@returnboolean 成功執(zhí)行返回true
*/

public static booleanFlymeSetStatusBarLightMode(Window window,booleandark) {
boolean result =false;

if(window !=null) {
try{
  WindowManager.LayoutParams lp = window.getAttributes();
  Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
  Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");
  darkFlag.setAccessible(true);
  meizuFlags.setAccessible(true);
  intbit = darkFlag.getInt(null);
  intvalue = meizuFlags.getInt(lp);
if(dark) {
  value |= bit;
}else{
  value &= ~bit;
}
  meizuFlags.setInt(lp, value);
  window.setAttributes(lp);
  result =true;
}catch(Exception e) {
}
}
return result;
}

/**
* 設(shè)置狀態(tài)欄字體圖標(biāo)為深色耀里,需要MIUIV6以上
*@paramwindow需要設(shè)置的窗口
*@paramdark是否把狀態(tài)欄字體及圖標(biāo)顏色設(shè)置為深色
*@returnboolean 成功執(zhí)行返回true
*/
public static booleanMIUISetStatusBarLightMode(Window window,booleandark) {
boolean result =false;
if(window !=null) {
  Class clazz = window.getClass();
try{
  intdarkModeFlag =0;
  Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
  Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
  darkModeFlag = field.getInt(layoutParams);
  Method extraFlagField = clazz.getMethod("setExtraFlags",int.class,int.class);
if(dark) {
  extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//狀態(tài)欄透明且黑色字體
}else{
  extraFlagField.invoke(window,0, darkModeFlag);//清除黑色字體
}
result =true;
}catch(Exception e) {
}
}
return result;
}

使用的方式,在把顏色值設(shè)置為白色的時(shí)候進(jìn)行設(shè)置:

StatusBarLightMode(activity,StatusBarLightMode(activity));

最后分享一個(gè)開源的狀態(tài)欄的庫拾氓,方便我們在開發(fā)的時(shí)候進(jìn)行集成使用:

https://github.com/laobie/StatusBarUtil

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冯挎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咙鞍,更是在濱河造成了極大的恐慌房官,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件续滋,死亡現(xiàn)場離奇詭異翰守,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疲酌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蜡峰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人徐勃,你說我怎么就攤上這事事示。” “怎么了僻肖?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵肖爵,是天一觀的道長。 經(jīng)常有香客問我臀脏,道長劝堪,這世上最難降的妖魔是什么冀自? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮秒啦,結(jié)果婚禮上熬粗,老公的妹妹穿的比我還像新娘。我一直安慰自己余境,他們只是感情好驻呐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芳来,像睡著了一般含末。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上即舌,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天佣盒,我揣著相機(jī)與錄音,去河邊找鬼顽聂。 笑死肥惭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的紊搪。 我是一名探鬼主播蜜葱,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嗦明!你這毒婦竟也來了笼沥?” 一聲冷哼從身側(cè)響起蚪燕,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤娶牌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后馆纳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诗良,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年鲁驶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鉴裹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钥弯,死狀恐怖径荔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脆霎,我是刑警寧澤总处,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站睛蛛,受9級(jí)特大地震影響鹦马,放射性物質(zhì)發(fā)生泄漏胧谈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一荸频、第九天 我趴在偏房一處隱蔽的房頂上張望菱肖。 院中可真熱鬧,春花似錦旭从、人聲如沸稳强。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽键袱。三九已至,卻和暖如春摹闽,著一層夾襖步出監(jiān)牢的瞬間蹄咖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工付鹿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澜汤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓舵匾,卻偏偏與公主長得像俊抵,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坐梯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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