自從android4.4開始,android手機狀態欄再也不是一成黑的時代,之前叫做變色龍,miui6發布會把他叫做沉浸式,之后大家就自然而然的接受了沉浸式這個名稱,其實實際應該叫做Translucent Bar,即為透明狀態欄。
沉浸式實現原理其實是使整個activity布局延伸到整個屏幕,然后使狀態欄變成透明色,有些手機會有導航欄,同樣也可以把導航欄變成透明色,這樣會使一些app更加美觀。
先看兩個概念
-
狀態欄
狀態欄.png -
導航欄
導航欄.png
廢話不多說了,直接看GIF

1、引入
github倉庫地址:https://github.com/gyf-dev/ImmersionBar

dependencies { compile 'com.gyf.barlibrary:barlibrary:2.3.0' }
2、特性
1)基本介紹
- 基礎用法,建議在BaseActivity里調用
public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); ImmersionBar.with(this).init(); //初始化,默認透明狀態欄和黑色導航欄 } @Override protected void onDestroy() { super.onDestroy(); ImmersionBar.with(this).destroy(); //不調用該方法,如果界面bar發生改變,在不關閉app的情況下,退出此界面再進入將記憶最后一次bar改變的狀態 } }
- 高級用法,如果基礎用法不能滿足你的需求,可以試試這里的方法
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支持 .addTag("tag") //給以上設置的參數打標記 .getTag("tag") //根據tag獲得沉浸式參數 .reset() //重置所以沉浸式參數 .keyboardEnable(true) //解決軟鍵盤與底部輸入框沖突問題,默認為false .setOnKeyboardListener(new OnKeyboardListener() { //軟鍵盤監聽回調 @Override public void onKeyboardChange(boolean isPopup, int keyboardHeight) { LogUtils.e(isPopup); //isPopup為true,軟鍵盤彈出,為false,軟鍵盤關閉 } }) .keyboardMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) //單獨指定軟鍵盤模式 .init(); //必須調用方可沉浸式
2)詳細介紹
-
解決狀態欄和布局頂部重合
上面已經說了,沉浸式原理就是使整個布局延伸到狀態欄和導航欄,既然這樣必然導致一個問題,就是狀態欄和布局頂部重疊,直接看圖

眼神好的同學已經看到上圖中給了五種解決方案啦,在這里說一下
-
1️⃣ 使用dimen自定義狀態欄高度
- 在values-v19/dimens.xml文件下
<dimen name="status_bar_height">25dp</dimen>
- 在values/dimens.xml文件下
<dimen name="status_bar_height">0dp</dimen>
- 然后在布局界面添加view標簽,高度指定為status_bar_height
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/darker_gray" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="@dimen/status_bar_height" android:background="@color/colorPrimary" /> <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" app:title="方法一" app:titleTextColor="@android:color/white" /> </LinearLayout>
-
2️⃣ 使用系統的fitsSystemWindows屬性
- 在布局文件的根節點使用android:fitsSystemWindows="true"屬性
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true"> </LinearLayout>
- 然后使用ImmersionBar時候必須指定狀態欄顏色
ImmersionBar.with(this) .statusBarColor(R.color.colorPrimary) .init();
- 3️⃣ 使用ImmersionBar的fitsSystemWindows(boolean fits)方法
- 實現原理是獲得rootView的根節點,然后設置距離頂部的padding值為狀態欄的高度值
```java ImmersionBar.with(this) .statusBarColor(R.color.colorPrimary) .fitsSystemWindows(true) //使用該屬性必須指定狀態欄的顏色,不然狀態欄透明,很難看 .init(); ```
-
4️⃣ 使用ImmersionBar的statusBarView(View view)方法
- 在標題欄的上方增加View標簽(也可以為其他標簽),高度指定為0dp
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/darker_gray" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="0dp" android:background="@color/colorPrimary" /> <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" app:title="方法四" app:titleTextColor="@android:color/white" /> </LinearLayout>
- 然后使用ImmersionBar的statusBarView方法,指定view就可以啦,實現原理:ImmersionBar獲取狀態欄的高度,傳入view,設置高度為獲取到的狀態欄高度
ImmersionBar.with(this) .statusBarView(view) .init();
-
5️⃣ 使用ImmersionBar的titleBar(View view)方法
ImmersionBar.with(this) .titleBar(view) //指定標題欄view .init();
-
總結:這五種方法,任選其一使用就可以了,不要一起使用哦,根據項目而定,比如有側邊欄的,建議使用第1️⃣種或者第4️⃣種或者第5️⃣種,最后來一張效果圖
五種方法最后效果圖.jpg -
在Fragment中實現沉浸式
注意:2.2.6版本已將ImmersionFragment這個類標記為過時,請用戶自行使用懶加載方式實現
-
在Fragment使用ImmersionBar
第一種,當結合viewpager使用的時候,請使用懶加載的形式,參考demo中的BaseLazyFragment這個類
第二種,當使用show()和hide()來控制Fragment顯示隱藏的時候,參考demo中的BaseTwoFragment這個類
注意:
- 2.2.7版本以后別忘了在Fragment的onDestroy方法里銷毀沉浸式了,2.2.7版本之前不需要調用
@Override protected void onDestroy() { super.onDestroy(); if (mImmersionBar != null) mImmersionBar.destroy(); }
- 以show()和hide()方式控制Fragment顯示隱藏,別忘了重寫onHiddenChanged方法,如下
@Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (!hidden && mImmersionBar != null) mImmersionBar.init(); }
-
在Activity使用ImmersionBar
第一種,當結合viewpager使用的時候,請使用viewpager的addOnPageChangeListener的方法監聽沉浸式,參考demo中FragmentThreeActivity這個類
第二種,當使用show()和hide()來控制Fragment顯示隱藏的時候,請在tab切換的時候使用ImmersionBar,參考demo中FragmentFourActivity這個類
-
使用Fragment第三方框架Fragmentation實現沉浸式
參考demo中FragmentFiveActivity和BaseFiveFragment這個類

-
在Dialog中實現沉浸式,具體實現參考demo
在DialogFragment使用
ImmersionBar.with(this, dialog).init();
其他Dialog
ImmersionBar.with(this, dialog, "flag") //第三個參數是為當前Dialog加上標記,多個Dialog之間不可相同 .init();
注意:在dialog使用,當銷毀dialog同時,別忘了調用ImmersionBar的destroy方法了

-
圖片狀態欄+彩色導航欄
ImmersionBar.with(this) .transparentStatusBar() //不寫也可以,默認就是透明色 .navigationBarColor(R.color.colorPrimary) .init();

-
全屏圖片
ImmersionBar.with(this).transparentBar().init();

-
彩色狀態欄+彩色導航欄
ImmersionBar.with(this) .statusBarColor(R.color.colorPrimary) .navigationBarColor(R.color.btn8) .init();

-
結合DrawerLayout使用

-
結合側滑返回使用

-
修改狀態欄字體顏色為深色
ImmersionBar.with(this).statusBarDarkFont(true).init();

-
設置狀態欄和導航欄透明度
ImmersionBar.with(this) .navigationBarColor(R.color.colorPrimary) .barAlpha(0.2f) .init();

-
隱藏狀態欄
ImmersionBar.with(this).hideBar(BarHide.FLAG_HIDE_STATUS_BAR).init();
-
隱藏導航欄
ImmersionBar.with(this).hideBar(BarHide.FLAG_HIDE_NAVIGATION_BAR).init();
-
隱藏狀態欄+導航欄
ImmersionBar.with(this).hideBar(BarHide.FLAG_HIDE_BAR).init();
-
恢復狀態欄+導航欄
ImmersionBar.with(this).hideBar(BarHide.FLAG_SHOW_BAR).init();
-
解決EditText和軟鍵盤的問題
實現原理:監聽界面容器的layout變化,當發生變化時,通過檢查窗口可見區域高度,判斷鍵盤是否彈起,如果彈起,則修改容器bottom padding,也就是手動實現adjustResize效果,給鍵盤留出顯示空間。
ImmersionBar.with(this) .keyboardEnable(true) //解決軟鍵盤與底部輸入框沖突問題 .init(); 或者 // KeyboardPatch.patch(this).enable(); 或者,layout指的是當前布局的根節點 // KeyboardPatch.patch(this, layout).enable();

-
當白色背景狀態欄遇到不能改變狀態欄字體為深色的設備時,解決方案
ImmersionBar.with(this) .statusBarDarkFont(true, 0.2f) .init();

-
特性總結
ImmersionBar除了這些特性之外,還有其他特性哦,這里就不一一指出了,大家參考高級用法的注釋,可以去實現看看哦,下面就來分析源碼吧
3、源碼分析
本庫采用類似建造者模式來完成,只為了方便大家更靈活的去設置狀態欄和導航欄風格。實現沉浸式是分為兩塊,一塊是android5.0以上,一塊是android4.4,這兩塊實現原理完全不一樣,在講解原理之前先看幾個概念,下面需要用到
-
View.SYSTEM_UI_FLAG_VISIBLE:顯示狀態欄,Activity不全屏顯示(恢復到有狀態的正常情況)。
-
View.INVISIBLE:隱藏狀態欄,同時Activity會伸展全屏顯示。
-
View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏顯示,且狀態欄被隱藏覆蓋掉。
-
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏顯示,但狀態欄不會被隱藏覆蓋,狀態欄依然可見,Activity頂端布局部分會被狀態遮住。
-
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
-
View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
-
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隱藏虛擬按鍵(導航欄)。有些手機會用虛擬按鍵來代替物理按鍵。
-
View.SYSTEM_UI_FLAG_LOW_PROFILE:狀態欄顯示處於低能顯示狀態(low profile模式),狀態欄上一些圖標顯示會被隱藏。
-
android 5.0以上核心代碼
Android自5.0起,為我們提供了設置狀態欄和導航欄顏色的API,我們可以自己設置狀態欄和導航欄的顏色。本框架在android5.0以上就是采用官方api完成的,網上關於5.0以上的實現基本都是這樣,在這里就不多說了,在這里只說一點,就是設置顏色的時候不是直接填入開發者傳入的顏色值,而是采用v4包下的ColorUtils.blendARGB()方法來設置,為什么這樣設計呢?有些app的狀態欄並不是和標題欄顏色相同,稍微有些色差,所以在這里開發者只需要通過blendARGB()設置透明度就可以形成這種色差,而且還可以指定兩種顏色之間的色差值,方便大家,android4.4上亦是如此。請看以下代碼:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { int uiFlags =View.SYSTEM_UI_FLAG_LAYOUT_STABLE //防止系統欄隱藏時內容區域大小發生變化 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; //Activity全屏顯示,但狀態欄不會被隱藏覆蓋,狀態欄依然可見,Activity頂端布局部分會被狀態欄遮住。 if (mBarParams.fullScreen) { uiFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; //Activity全屏顯示,但導航欄不會被隱藏覆蓋,導航欄依然可見,Activity底部布局部分會被導航欄遮住。 } mWindow.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); //取消設置透明狀態欄和導航欄 mWindow.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); //需要設置這個才能設置狀態欄顏色 mWindow.setStatusBarColor(ColorUtils.blendARGB(mBarParams.statusBarColor, mBarParams.statusBarColorTransform, mBarParams.statusBarAlpha)); //設置狀態欄顏色 mWindow.setNavigationBarColor(ColorUtils.blendARGB(mBarParams.navigationBarColor, mBarParams.navigationBarColorTransform, mBarParams.navigationBarAlpha)); //設置導航欄顏色 mWindow.getDecorView().setSystemUiVisibility(uiFlags); 把剛才設置的標記通過setSystemUiVisibility方法設置進去 }
-
android 4.4核心代碼
在4.4里就沒有5.0以上這些api了,只能設置透明狀態欄和導航欄,而且設置透明導航欄之后,底部布局會被導航欄遮住,那怎么辦呢?好吧,只能自己寫代碼去實現啦。再說之前,說說我的一個思路吧。現在是2.x.x版本,在1.x.x版本的時候,4.4中實現沉浸式是引用大家非常熟悉的一個庫SystemBarTint(不推薦使用了,很久沒人維護了)來實現的,但是后來發現一個嚴重的問題,對於有導航欄的手機,設置導航欄顏色的時候,底部布局會被導航欄遮住,除此之外還有一個小問題就是當用戶設置狀態欄為透明色的時候,不能時刻改變bar的顏色值,are you kidding?既然出現這樣的問題,就想着怎么去解決吧!就這樣,我乖乖去看看SystemBarTint的源代碼,哦!原理如此,發現SystemBarTint庫的實現就是在狀態欄和導航欄的位置自定義了可以改變背景顏色的view,然后通過window.getDecorView()得到根布局,把剛才創建的view添加進去,既然這樣,為何不自己也寫一個,順便把剛才說到導航欄的問題也解決一下呢。解決方法如下代碼,在這里通過注釋的方法向大家說明。這里代碼只是片段,不可以直接拷貝到自己的項目中
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明狀態欄 mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//透明導航欄,設置這個,如果有導航欄,底部布局會被導航欄遮住 setupStatusBarView(); //在根節點創建一個可以自定義顏色的狀態欄創建一個假的狀態欄 if (mConfig.hasNavigtionBar()) //判斷是否存在導航欄 setupNavBarView(); //在根節點創建一個可以自定義顏色的導航欄 // 解決android4.4有導航欄的情況下,activity底部被導航欄遮擋的問題 if (mConfig.hasNavigtionBar() && !mBarParams.fullScreenTemp && !mBarParams.fullScreen) { if (mConfig.isNavigationAtBottom()) //判斷導航欄是否在底部 mContentView.setPadding(0, 0, 0, mConfig.getNavigationBarHeight()); //有導航欄,獲得當前布局的根節點,然后設置距離底部的padding值為導航欄的高度值 else mContentView.setPadding(0, 0, mConfig.getNavigationBarWidth(), 0); //不在底部,設置距離右邊的padding值為導航欄的寬度值 } else { mContentView.setPadding(0, 0, 0, 0); //沒有導航欄,什么都不做 } } /** * 在根節點創建一個可以自定義顏色的狀態欄 */ private void setupStatusBarView() { if (mBarParams.statusBarView == null) { mBarParams.statusBarView = new View(mActivity);//創建一個view } FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(mActivity)); params.gravity = Gravity.TOP; //把view設置在頂部 if (!isNavigationAtBottom(mActivity)) { params.rightMargin = getNavigationBarWidth(mActivity); //橫屏的時候,距離右邊的距離 } mBarParams.statusBarView.setLayoutParams(params); mBarParams.statusBarView.setBackgroundColor(ColorUtils.blendARGB(mBarParams.statusBarColor, mBarParams.statusBarColorTransform, mBarParams.statusBarAlpha));//設置view的顏色 mBarParams.statusBarView.setVisibility(View.VISIBLE); ViewGroup viewGroup = (ViewGroup) mBarParams.statusBarView.getParent(); if (viewGroup != null) viewGroup.removeView(mBarParams.statusBarView); mViewGroup.addView(mBarParams.statusBarView); } /** * 在根節點創建一個可以自定義顏色的導航欄 */ private void setupNavBarView() { if (mBarParams.navigationBarView == null) { mBarParams.navigationBarView = new View(mActivity); //創建一個view } FrameLayout.LayoutParams params; if (isNavigationAtBottom(mActivity)) { //判斷導航欄是否在底部 params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getNavigationBarHeight(mActivity)); params.gravity = Gravity.BOTTOM; //如果在底部把view設置在導航欄的位置 } else { params = new FrameLayout.LayoutParams(getNavigationBarWidth(mActivity), FrameLayout.LayoutParams.MATCH_PARENT); params.gravity = Gravity.END; //不在底部,把view設置到布局的結束位置 } mBarParams.navigationBarView.setLayoutParams(params); if (!mBarParams.fullScreen && (mBarParams.navigationBarColorTransform == Color.TRANSPARENT)) { mBarParams.navigationBarView.setBackgroundColor(ColorUtils.blendARGB(mBarParams.navigationBarColor, Color.BLACK, mBarParams.navigationBarAlpha)); } else { mBarParams.navigationBarView.setBackgroundColor(ColorUtils.blendARGB(mBarParams.navigationBarColor, mBarParams.navigationBarColorTransform, mBarParams.navigationBarAlpha)); } mBarParams.navigationBarView.setVisibility(View.VISIBLE); ViewGroup viewGroup = (ViewGroup) mBarParams.navigationBarView.getParent(); if (viewGroup != null) viewGroup.removeView(mBarParams.navigationBarView); mViewGroup.addView(mBarParams.navigationBarView); }
-
狀態欄字體顏色
沉浸式原理說完了,在看看狀態欄字體顏色怎么去修改吧,在android 6.0以上系統為我們提供了相關的api來設置狀態欄字體顏色,如下
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); }
但是對於一些第三方rom包來說,系統api就沒辦法實現了,還好小米和魅族公開了各自的實現方法,如下:
- flymeOS:
public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) { 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); int bit = darkFlag.getInt(null); int value = meizuFlags.getInt(lp); if (dark) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(lp, value); window.setAttributes(lp); result = true; } catch (Exception e) { } } return result; }
- MIUI:
public static boolean MIUISetStatusBarLightMode(Window window, boolean dark) { boolean result = false; if (window != null) { Class clazz = window.getClass(); try { int darkModeFlag = 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);//狀態欄透明且黑色字體 }else{ extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字體 } result=true; }catch (Exception e){ } } return result; }
-
狀態欄和導航欄的隱藏
android 4.1以上支持狀態欄和導航欄隱藏
private int hideBar(int uiFlags) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { switch (mBarParams.barHide) { case FLAG_HIDE_BAR: //隱藏狀態欄和導航欄 uiFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.INVISIBLE; break; case FLAG_HIDE_STATUS_BAR: //隱藏狀態欄 uiFlags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.INVISIBLE; break; case FLAG_HIDE_NAVIGATION_BAR://隱藏導航欄 uiFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; break; case FLAG_SHOW_BAR://恢復顯示 uiFlags |= View.SYSTEM_UI_FLAG_VISIBLE; break; } } return uiFlags | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; }
4、總結
至此,ImmersionBar庫的用法與原理都講完了。網上關於沉浸式的介紹鋪天蓋地,但是很少有人把它們封裝起來,當開發者調用的時候還得自己去寫大量代碼,消耗大家時間。而這個庫的目的就是方便大家的開發,解決大家在沉浸式方面出現的問題。如果還有不懂得地方可以去demo里看看.