天天看点

android开发:沉浸式状态栏

平时我们运用到的所有App都会用到沉浸式状态栏,它的功能是将系统状态栏透明化,并允许我们的应用从屏幕下方开始布局

如下图:我们的应用是从屏幕下方就开始布局,状态栏的颜色跟我们的标题栏是一致的。如果不使用沉浸式状态栏的话,默认状态栏一般都是灰色或者黑色,并且应用是从状态栏下方开始布局,这样子就会显得整个应用跟状态栏格格不入,影响应用体验。

android开发:沉浸式状态栏

如何实现沉浸式状态栏:

1.设置我们的应用主题为NoActionBar并且设置windowTranslucentStatus属性为true

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     Customize your theme here.
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
</style>
           

这样子设置后启动应用你会发现效果如下:

android开发:沉浸式状态栏

是的,状态栏透明化了,我们的应用也是从屏幕下方开始布局。但是你会发现你的内容跟状态栏的内容重叠了。这当然不是我们想要的效果。

我的标题栏是个RelativeLayout布局,背景是张图片,里面放了一个TextView。我在里面设置了一个属性

android:fitsSystemWindows="true"
           

这个属性等同于给我的标题栏加了一个和状态栏一样高度的paddingTop,这样子RelativeLayout中的控件就会往下移动,实现我们想要的效果。

遇到的坑:如果你的TextView位置设成layout_centerInParent会出错,状态栏颜色和你的背景图一样但是会覆盖你的标题栏。我也搞不清为啥。

貌似安卓5.0以上开启沉浸式状态栏的时候,状态栏会变成半透明的,会有一层灰色。可以在程序中判断,改为透明就可以了。

//消除状态栏底部的阴影
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(getWindow().getDecorView(), Color.TRANSPARENT);  //改为透明
    } catch (Exception e) {}
}
           

详细可以参考这篇博客:https://blog.csdn.net/hmmhhmmhmhhm/article/details/77840604

继续阅读