前言
在 Android 4.4 中引入了沉浸模式的功能,但這個版本非真正的沉浸模式,應該說是透明模式。Android 5.0 以后才可以在系統層面實現真正的沉浸式狀態欄。沉浸式狀態欄是為了與當前使用的 App 頁面風格統一,不會顯的那么突兀,保持友好且一致的用戶體驗而設計,是現在主流 App 必備的適配內容。今天我們就細細的研究一下沉浸式狀態欄的適配。
上效果
先贊后看,更新永不斷
實現的功能看實現代碼狀態欄設置為透明
/**
* 設置透明StatusBar
*
* @param activity Activity
*/
private static void setTranslucentStatusBar(Activity activity) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return;
}
Window window = activity.getWindow();
//透明狀態欄
window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.0及以上版本,創建 Navigation Bar
createNavBar(activity);
} else {
//4.4 版本設置為透明狀態欄
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
切換狀態欄主題
這里主要是為了更好的適配頁面背景,因為有的頁面適合白色的狀態欄圖標,有的適合黑色的狀態欄圖標
/**
* Android 6.0使用原始的主題適配
*
* @param activity Activity
* @param darkMode 是否是黑色模式
*/
public static void setBarDarkMode(Activity activity, boolean darkMode) {
Window window = activity.getWindow();
if (window == null) {
return;
}
//設置StatusBar模式
if (darkMode) {//黑色模式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//設置statusBar和navigationBar為黑色
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {//設置statusBar為黑色
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}
} else {//白色模式

int statusBarFlag = View.SYSTEM_UI_FLAG_VISIBLE;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
statusBarFlag = window.getDecorView().getSystemUiVisibility()
& ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//設置statusBar為白色,navigationBar為灰色
// int navBarFlag = window.getDecorView().getSystemUiVisibility()
// & ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;//如果想讓navigationBar為白色,那么就使用這個代碼。
int navBarFlag = View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
window.getDecorView().setSystemUiVisibility(navBarFlag | statusBarFlag);
} else {
window.getDecorView().setSystemUiVisibility(statusBarFlag);
}
}
setHuaWeiStatusBar(darkMode, window);
}
白色黑色
設置 Bar 配色
現在是全面屏手機了,但是也可以設置開啟虛擬導航欄的。這里主要是更改 Bar 在不同 Android 版本的配色,這里可以根據設計師的配色或者分裝成接口使用。
/**
* 創建Navigation Bar
*
* @param activity 上下文
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static void createNavBar(Activity activity) {
int navBarHeight = getNavigationBarHeight(activity);
int navBarWidth = getNavigationBarWidth(activity);
if (navBarHeight > 0 && navBarWidth > 0) {
//創建NavigationBar
View navBar = new View(activity);
FrameLayout.LayoutParams pl;
if (activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
pl = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, navBarHeight);
pl.gravity = Gravity.BOTTOM;
} else {
pl = new FrameLayout.LayoutParams(navBarWidth, ViewGroup.LayoutParams.MATCH_PARENT);
pl.gravity = Gravity.END;
}
navBar.setLayoutParams(pl);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
navBar.setBackgroundColor(Color.parseColor("#fffafafa"));
} else {
navBar.setBackgroundColor(Color.parseColor("#40000000"));
}
//添加到布局當中
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
decorView.addView(navBar);
//設置主布局PaddingBottom
ViewGroup contentView = decorView.findViewById(android.R.id.content);
if (activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
contentView.setPaddingRelative(0, 0, 0, navBarHeight);
} else {
contentView.setPaddingRelative(0, 0, navBarWidth, 0);
}
}
}
修復 頂部白邊的問題
在實際項目中我們可能會用到 ,但是設置了透明狀態欄后,在 Android 4.4 上會出現頂部白邊的問題,通過下面的方法可修復
/**
* 設置 DrawerLayout 在4.4版本下透明,不然會出現白邊
*
* @param drawerLayout DrawerLayout
*/
public static void setTranslucentDrawerLayout(DrawerLayout drawerLayout) {
if (drawerLayout != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
drawerLayout.setFitsSystemWindows(true);
drawerLayout.setClipToPadding(false);
}
}
到這里我們已經看到了實現的核心方法,我已經封裝了一個 ,方便項目中使用可以,下面我們介紹一下如何使用,并且你可以直接查看我編寫好的 GitHub wiki
使用方法如何引用?
暫時不提供遠程庫引用的方式,只有一個類,點擊下載 然后放到項目中即可,也方便自己擴展。
調用方法
AndroidBarUtils.setTranslucent(this);
//ToolBar、自定義的TitleBar 重疊問題以及適配劉海屏
AndroidBarUtils.setBarPaddingTop(this, view);
//false:白色 true:黑色
AndroidBarUtils.setBarDarkMode(this, false);
不常見問題
AndroidBarUtils.setTranslucentDrawerLayout(drawerLayout);
AndroidBarUtils.setBarPaddingTop(this,navigationView.getHeaderView(0));
最終效果
圖片較大如果看不了,可以去 GitHub 上看哦
源碼倉庫總結
本文我們為了優化用戶的 App 使用體驗,一起查看了 Android 各個版本上沉浸式(透明)狀態欄的實現細節,并適配了黑白狀態欄主題以及 和 的異常情況。雖然是很小的一個優化的點,但是從頁面美觀和體驗角度做了很大的提升。
參考:關于我
*請認真填寫需求信息,我們會在24小時內與您取得聯系。