android沉浸式狀態欄封裝—教你玩出新花樣

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

效果圖如下:

沉浸式進行測試

解決白色狀態欄問題

正文

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

說明

  • 這是狀態欄 這是狀態欄
  • 這是導航欄(有些手機沒有導航欄) 導航欄

[](https://github.com/gyf-dev/Im...

  • 第一種方案: 可直接在主題中設置
    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);
        }

或者也可以這樣 :

  • 第二種方案:

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

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

集合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

沉浸式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 有導航欄效果

項目地址:

https://github.com/androidsta...

gyf-dev的博客地址:

https://github.com/gyf-dev/Im...

博客地址:

http://blog.csdn.net/androids...

如果你覺得此文對您有所幫助,歡迎入羣 QQ交流羣 :232203809
微信公衆號:終端研發部

職場+技術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章