整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Android 沉浸式(透明)狀態欄細研-超級細還附 Demo | 創作者訓練營第二期

          前言

          在 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 {//白色模式
          

          android沉浸式狀態欄_沉浸式狀態欄xposed模塊_android 沉浸式通知欄

          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 各個版本上沉浸式(透明)狀態欄的實現細節,并適配了黑白狀態欄主題以及 和 的異常情況。雖然是很小的一個優化的點,但是從頁面美觀和體驗角度做了很大的提升。

          參考:關于我


          主站蜘蛛池模板: 91午夜精品亚洲一区二区三区 | 熟女少妇丰满一区二区| 亚洲蜜芽在线精品一区| 成人区人妻精品一区二区不卡视频 | 一区五十路在线中出| 亚洲一区二区视频在线观看| 一区二区三区免费视频网站| 日韩精品一区二区三区中文精品| 亚洲码欧美码一区二区三区| 国产在线视频一区| 久久一区二区三区99| 天堂不卡一区二区视频在线观看 | 精品国产亚洲一区二区在线观看| 高清无码一区二区在线观看吞精 | 日本一区二区三区中文字幕| 国产精品视频免费一区二区三区 | 色天使亚洲综合一区二区| 无码人妻少妇色欲AV一区二区| 国产在线精品一区二区| 日本一区二区高清不卡| 果冻传媒董小宛一区二区| 国产在线步兵一区二区三区| 精品人妻无码一区二区三区蜜桃一| 一区二区三区免费精品视频 | 在线|一区二区三区| 亚洲一区二区三区在线观看网站 | 人妻无码一区二区三区免费| 红桃AV一区二区三区在线无码AV| 肥臀熟女一区二区三区| 亚洲国产精品一区二区第一页免 | 无码人妻av一区二区三区蜜臀| 视频一区精品自拍| 3d动漫精品成人一区二区三| 日本一区二区三区在线网 | 精品一区二区三区自拍图片区| 日本一区二区在线| 精品国产高清自在线一区二区三区 | 色系一区二区三区四区五区| 国产在线一区二区三区av| 国模私拍福利一区二区| 无码av中文一区二区三区桃花岛|