沉浸式状态栏的实现
一個Android應用程序的界面有好多系統元素
有狀態欄,ToolBar,導航欄,而打造沉浸式狀態欄則是將這些屬性隱藏,只留下主體,所謂沉浸式,就是讓用戶像是沉浸在頁面里一樣,在做沉浸式狀態欄之前呢,我先帶大家了解一下項目中values的含義
?
有時我們會在項目中看到values-v11,values-v14,values-v19等文件夾,里面有dimens,styles等。那具體代表是什么呢?到了4.0以上系統,多了v14等文件夾,之后才明白跟android 的api版本有關系。
?
?values-v11代表在API 11+的設備上,其中API 11+代表android 3.0 +,3.0以上版本都會使用這里面的配置文件
?values-v14代表在API 14+的設備上,?其中API 14+代表android 4.0?+,4.0以上版本都會使用這里面的配置文件
?
?values-v19代表在API ?19+的設備上,其中API ?19+代表android 4.4 +?(可以設置沉浸模式等)
在sdk manager中可以看到目前為止的android sdk版本和api對應的關系
26 -> android 8.0
25 -> android 7.1.1
24 -> android 7.0
23 -> android 6.0
22 -> android 5.1
21 -> android 5.0
20 -> android 4.4w
19 -> android 4.4
好,下來我們說一下沉浸式狀態欄:
第一種方式:通過設置Theme主題設置狀態欄透明(跟第五種方法幾乎相同,但在第五種方式做了簡單的擴展)
因為 API-21 之后(也就是 android 5.0 之后)的狀態欄,會默認覆蓋一層半透明遮罩。且為了保持4.4以前系統正常使用,故需要三份 style 文件,即默認的values(不設置狀態欄透明)、values-v19、values-v21(解決半透明遮罩問題)。
//valuse <style name="TranslucentTheme" parent="AppTheme"> </style>// values-v19。v19 開始有 android:windowTranslucentStatus 這個屬性 <style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar"><item name="android:windowTranslucentStatus">true</item><item name="android:windowTranslucentNavigation">true</item> </style>下面在style中設置屬性這種方法Android6.0和Android7.0都可以實現沉浸式狀態欄,經測試后Android6.0和Android8.0幾乎是沒什么問題了
,但對于華為Android7.0來說,底部有個導航欄,鑲嵌在了頁面里,用戶體驗都不是很好,下面代碼設置是可以解決這個問題
// values-v21。5.0 以上提供了 setStatusBarColor() 方法設置狀態欄顏色。 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><item name="android:windowTranslucentStatus">false</item><item name="android:windowTranslucentNavigation">true</item><!--Android 5.x開始需要把顏色設置透明,否則導航欄會呈現系統默認的淺灰色--><item name="android:statusBarColor">@android:color/transparent</item></style>?
?
第二種方式:代碼設置狀態欄,這里面解決了避免狀態欄一些系統菜單和狀態欄顏色一樣的問題。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Window window = this.getWindow();window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//設置狀態欄文字顏色及圖標為淺色window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);//這個是將狀態欄文字顏色設置成深色 // window.getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {try {Class decorViewClazz = Class.forName("com.android.internal.policy.DecorView");Field field = decorViewClazz.getDeclaredField("mSemiTransparentStatusBarColor");field.setAccessible(true);field.setInt(window.getDecorView(), Color.TRANSPARENT); //改為透明} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}}window.setStatusBarColor(this.getResources().getColor(R.color.bg_color)); }?
第三種方式:可以直接把style中的三個系統默認顏色設置成跟主題幾乎一樣的顏色
第四種方式:兩行代碼直接實現
//無title requestWindowFeature(Window.FEATURE_NO_TITLE); //全屏 getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN); //此兩段代碼必須設置在setContentView()方法之前第五種方式:(本人最傾向于使用這種方法,經多次測試,5.0以上都能實現沉浸式狀態欄效果)
在Value中的style中設置
<item name="android:statusBarColor">@android:color/transparent</item><!-- 如果需要導航欄也透明加下面這行代碼 --><!--<item name="android:navigationBarColor">@android:color/transparent</item>--><item name="android:windowTranslucentStatus">false</item><!-- 如果需要導航欄也透明加下面這行代碼 --><item name="android:windowTranslucentNavigation">true</item>這里的話要注意一點:statusBarColor和windowTranslucentStatus是不能同時使用的,要不就把后者設置為false ,因為前者是設置狀態欄顏色,而后者是設置狀態欄半透明狀態,效果是將內容侵入到狀態欄之后,兩種效果相沖突,如果兩個屬性都設置的話,出來的效果就是狀態欄帶一個保護色;
還有一點呢,我們在開發的時候經常會遇到狀態欄式淺色的,狀態欄上面的文字也是淺色,用戶體驗及其不好,怎么設置狀態欄文字顏色為深色或者淺色呢。這個的話在setContentView();方法后加上如下代碼就OJBK了
//設置狀態欄文字顏色及圖標為淺色getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);//這個是將狀態欄文字顏色設置成深色 getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);第六種方式呢:(是不是感覺好驚訝,我也有點驚呀,沉浸式狀態欄竟然有這么多設置方法,并且還有第三方庫,驚呆了!)
我也是偶然看到一篇博客才發現的,這里給大家推薦一個比較好用的設置沉浸式狀態欄的第三方庫ImmersionBar:
github地址:https://github.com/gyf-dev/ImmersionBar
具體的用法呢,我感覺那位博主寫的比較詳細,推薦大家去他的博客里看一下:
https://blog.csdn.net/cjm2484836553/article/details/78420172
?
在這里我給大家提供一些常用的Theme主題
窗口主題設置:(這里主要對于Activity設置,用到系統自動主題內容) ?android:theme=”@android:style/Theme.Dialog” 將一個Activity顯示為能話框模式 ?android:theme=”@android:style/Theme.NoTitleBar” 不顯示應用程序標題欄 ?android:theme=”@android:style/Theme.NoTitleBar.Fullscreen” 不顯示應用程序標題欄,并全屏 ?android:theme=”Theme.Light” 背景為白色 ?android:theme=”Theme.Light.NoTitleBar” 白色背景并無標題欄 ?android:theme=”Theme.Light.NoTitleBar.Fullscreen” 白色背景,無標題欄,全屏 ?android:theme=”Theme.Black” 背景黑色 ?android:theme=”Theme.Black.NoTitleBar” 黑色背景并無標題欄 ?android:theme=”Theme.Black.NoTitleBar.Fullscreen” 黑色背景,無標題欄,全屏 ?android:theme=”Theme.Wallpaper” 用系統桌面為應用程序背景 ?android:theme=”Theme.Wallpaper.NoTitleBar” 用系統桌面為應用程序背景,且無標題欄 ?android:theme=”Theme.Wallpaper.NoTitleBar.Fullscreen” 用系統桌面為應用程序背景,無標題欄,全屏 ?android:theme=”Translucent” 半透明 ?android:theme=”Theme.Translucent.NoTitleBar” 半透明無標題欄 ?android:theme=”Theme.Translucent.NoTitleBar.Fullscreen” 半透明無標題欄充滿全屏 ?android:theme=”Theme.Panel” 平板風格 ?android:theme=”Theme.Light.Panel”白色背景平板風格May everyone be happy every day and everything go well!
?
?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: Android图片加载框架之(Glide
- 下一篇: 数组和集合的区别?你还知道这些吗?