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