Android沉浸式狀態欄還能這樣玩—教你玩出新花樣

項目中咱們有時候都要用的透明狀態欄(這裏也成沉浸式狀態欄),今天介紹一個gyf-dev寫的一個封裝狀態欄開源框架java

效果圖以下:android

沉浸式進行測試
沉浸式進行測試

解決白色狀態欄問題
解決白色狀態欄問題

正文

從Android4.4開始,才能夠實現狀態欄着色,而且從5.0開始系統更加完善了這一功能。以前寫過關於一篇 關於activity狀態欄的一些總結
有關Activity樣式 、狀態欄透明、屏幕亮度問題應用場景及其總結git

說明

動態圖bash

  • 第一種方案: 可直接在主題中設置微信

    getWindow().setBackgroundDrawable(null);
          //設置透明狀態欄
          ViewGroup contentFrameLayout = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);
          View parentView = contentFrameLayout.getChildAt(0);
          if (parentView != null && Build.VERSION.SDK_INT >= 14) {
              parentView.setFitsSystemWindows(true);
          }複製代碼

    或者也能夠這樣 :
    app

  • 第二種方案:框架

將佈局延伸到狀態欄來處理,此次咱們使用android:fitsSystemWindows=」true」屬性,不讓佈局延伸到狀態欄,這時狀態欄就是透明的,而後添加一個和狀態欄高、寬相同的指定顏色View來覆蓋被透明化的狀態欄。咱們一步步來實現。ide

一、第一步仍是先將狀態欄透明化,方法同上。
二、在佈局文件中添加android:fitsSystemWindows=」true」屬性:

集合actionBar的使用.gif
集合actionBar的使用.gif

封裝:

ImmersionBar.with(this)
             .transparentStatusBar()  //透明狀態欄,不寫默認透明色
             .transparentNavigationBar()  //透明導航欄,不寫默認黑色(設置此方法,fullScreen()方法自動爲true)
             .transparentBar()             //透明狀態欄和導航欄,不寫默認狀態欄爲透明色,導航欄爲黑色(設置此方法,fullScreen()方法自動爲true)
             .statusBarColor(R.color.colorPrimary)     //狀態欄顏色,不寫默認透明色
             .navigationBarColor(R.color.colorPrimary) //導航欄顏色,不寫默認黑色
             .barColor(R.color.colorPrimary)  //同時自定義狀態欄和導航欄顏色,不寫默認狀態欄爲透明色,導航欄爲黑色
             .statusBarAlpha(0.3f)  //狀態欄透明度,不寫默認0.0f
             .navigationBarAlpha(0.4f)  //導航欄透明度,不寫默認0.0F
             .barAlpha(0.3f)  //狀態欄和導航欄透明度,不寫默認0.0f
             .statusBarDarkFont(true)   //狀態欄字體是深色,不寫默認爲亮色
             .flymeOSStatusBarFontColor(R.color.btn3)  //修改flyme OS狀態欄字體顏色
             .fullScreen(true)      //有導航欄的狀況下,activity全屏顯示,也就是activity最下面被導航欄覆蓋,不寫默認非全屏
             .hideBar(BarHide.FLAG_HIDE_BAR)  //隱藏狀態欄或導航欄或二者,不寫默認不隱藏
             .addViewSupportTransformColor(toolbar)  //設置支持view變色,能夠添加多個view,不指定顏色,默認和狀態欄同色,還有兩個重載方法
             .titleBar(view)    //解決狀態欄和佈局重疊問題,任選其一
             .statusBarView(view)  //解決狀態欄和佈局重疊問題,任選其一
             .fitsSystemWindows(true)    //解決狀態欄和佈局重疊問題,任選其一,默認爲false,當爲true時必定要指定statusBarColor(),否則狀態欄爲透明色
             .supportActionBar(true) //支持ActionBar使用
             .statusBarColorTransform(R.color.orange)  //狀態欄變色後的顏色
             .navigationBarColorTransform(R.color.orange) //導航欄變色後的顏色
             .barColorTransform(R.color.orange)  //狀態欄和導航欄變色後的顏色
             .removeSupportView(toolbar)  //移除指定view支持
             .removeSupportAllView() //移除所有view支持
             .navigationBarEnable(true)   //是否能夠修改導航欄顏色,默認爲true
             .navigationBarWithKitkatEnable(true)  //是否能夠修改安卓4.4和emui3.1手機導航欄顏色,默認爲true
             .fixMarginAtBottom(true)   //當xml裏使用android:fitsSystemWindows="true"屬性時,解決4.4和emui3.1手機底部有時會出現多餘空白的問題,默認爲false,非必須
             .addTag("tag")  //給以上設置的參數打標記
             .getTag("tag")  //根據tag得到沉浸式參數
             .reset()  //重置因此沉浸式參數
             .keyboardEnable(true)  //解決軟鍵盤與底部輸入框衝突問題,默認爲false,還有一個重載方法,能夠指定軟鍵盤mode
             .init();  //必須調用方可沉浸式複製代碼

使用方式

  • 第一步:基礎用法(已經能夠知足平常沉浸式)
    ImmersionBar.with(this).init();複製代碼
  • 第二步

在activity的onDestroy方法中執行

ImmersionBar.with(this).destroy(); //不調用該方法,若是界面bar發生改變,在不關閉app的狀況下,退出此界面再進入將記憶最後一次bar改變的狀態複製代碼
  • 建議
    建議在BaseActivity中初始化和銷燬,能夠參看demo中
    BaseActivity

    public class BaseActivity extends AppCompatActivity {
    
       private ImmersionBar mImmersionBar;
       @Override
       protected void onCreate(@Nullable Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
         mImmersionBar = ImmersionBar.with(this);
         mImmersionBar.init();   //全部子類都將繼承這些相同的屬性
    
       }
    
       @Override
       protected void onDestroy() {
           super.onDestroy();
           mImmersionBar.destroy();  //不調用該方法,若是界面bar發生改變,在不關閉app的狀況下,退出此界面再進入將記憶最後一次bar改變的狀態
       }
    }複製代碼

    能夠結合webView
    能夠結合webView

沉浸式fragment
沉浸式fragment

  • 如何 隱藏導航欄或狀態欄
    /**
       * 隱藏導航欄或狀態欄
       *
       * @param barHide the bar hide
       * @return the immersion bar
       */
      public ImmersionBar hideBar(BarHide barHide) {
          mBarParams.barHide = barHide;
          if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT || OSUtils.isEMUI3_1()) {
              if ((mBarParams.barHide == BarHide.FLAG_HIDE_NAVIGATION_BAR) ||
                      (mBarParams.barHide == BarHide.FLAG_HIDE_BAR)) {
                  mBarParams.navigationBarColor = Color.TRANSPARENT;
                  mBarParams.fullScreenTemp = true;
              } else {
                  mBarParams.navigationBarColor = mBarParams.navigationBarColorTemp;
                  mBarParams.fullScreenTemp = false;
              }
          }
          return this;
      }複製代碼

    部分問題

解決華爲emui3.0或者3.1手機手動隱藏導航欄按鈕時,導航欄背景未被隱藏的問題

什麼叫作手動隱藏,就是下圖中標紅的向下隱藏按鈕

第一種解決方案,監聽華爲虛擬按鈕,建議在baseActivity裏使用

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        immersionBar = ImmersionBar.with(this);
        immersionBar.init();
        if (OSUtils.isEMUI3_1())  //解決華爲emui3.0與3.1手機手動隱藏底部導航欄時,導航欄背景色未被隱藏的問題
            getContentResolver().registerContentObserver(Settings.System.getUriFor
                    ("navigationbar_is_min"), true, mNavigationStatusObserver);
    }

    private ContentObserver mNavigationStatusObserver = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
            int navigationBarIsMin = Settings.System.getInt(getContentResolver(),
                    "navigationbar_is_min", 0);
            if (navigationBarIsMin == 1) {
                //導航鍵隱藏了
                immersionBar
                        .transparentNavigationBar()
                        .init();
            } else {
                //導航鍵顯示了
                immersionBar
                        .navigationBarColor(android.R.color.black)
                        .fullScreen(false)
                        .init();
            }
        }
    };複製代碼
  • 第二種解決方案,禁止對導航欄相關設置
    ImmersionBar.with(this)
                     .navigationBarEnable(false)   //禁止對導航欄相關設置
                   //或者
                   // .navigationBarWithKitkatEnable(false)  //禁止對4.4設備導航欄相關設置
                     .init();複製代碼

    android 6.0 有導航欄效果

 6.0 有導航欄效果
6.0 有導航欄效果

項目地址:

github.com/androidstar…

gyf-dev的博客地址:

github.com/gyf-dev/Imm…

博客地址:

blog.csdn.net/androidstar…

若是你以爲此文對您有所幫助,歡迎入羣 QQ交流羣 :232203809
微信公衆號:終端研發部

職場+技術
職場+技術
相關文章
相關標籤/搜索