網(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)行集成使用: