沉浸式状态栏的实现

一个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!


 

猜你喜欢

转载自blog.csdn.net/jing_80/article/details/81066436