沉浸式状态栏

别等时光非礼了梦想. 提交于 2019-11-28 08:14:25

沉浸式状态栏,最简单的理解就是:通知栏会根据手机内容适应性变色。Android对沉浸式的支持是从4.4开始的。

沉浸式状态栏的实现

  1. 主题
    在主题配置中添加<item name="android:windowTranslucentStatus">true</item>
    具体如下:
<style name="Theme.AppCompat.Light.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <!--add-->
        <item name="android:windowTranslucentStatus">true</item>
</style>

修改主题即可实现沉浸式,但此时的布局是整体向上移动了,如下图所示:

非沉浸式
沉浸式
这个问题可以通过设置toolbar的paddingTop值来优化,让paddingTop值等于状态栏的高。状态栏的高度可以动态获取。

  1. 代码配置
    在onCreate方法里执行getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    可以达到与主题中配置同样的效果。
  2. 设置顶部的view(大多数时候是toolbar)的padding值
/**
     * 获取状态栏高度
     * @param context
     * @return
     */
    public static int getStatusBarHeight(Context context) {
        int resId =  context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resId > 0) {
            return context.getResources().getDimensionPixelSize(resId);
        }
        return 0;
    }

    /**
     * 设置顶部view边距
     * @param context
     * @param view
     */
    public static void setHeightAndPadding(Context context, View view) {
        if (view != null) {
            ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
            layoutParams.height += getStatusBarHeight(context);
            view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + getStatusBarHeight(context),
                    view.getPaddingRight(),view.getPaddingBottom());
        }
    }

根据Android版本不同,沉浸式设置不同

  1. Android 5.0 之前的系统,直接按照上述方法在主题xml或代码中配置,可配置状态栏和虚拟导航栏,注意设置顶部view的边距即可。
  2. Android 5.0之后的系统,需要手动在代码中设置一下状态栏颜色和布局(因为5.0之后的系统设置中,直接设置window的flag,顶部状态栏默认会有阴影,如果要去掉阴影,则需手动设置状态栏颜色为透明)
  3. 代码实现
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            //小于Android 4.4不支持沉浸式
            return;
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //大于等于Android 5.0手动配置状态栏
            Window window = getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            //设置状态栏背景颜色透明
            window.setStatusBarColor(Color.TRANSPARENT);
            int visibility = window.getDecorView().getSystemUiVisibility();
            //布局内容全展示
            visibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
            //防止内容区域大小发生变化
            visibility |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            window.getDecorView().setSystemUiVisibility(visibility);
        } else {
            //低于Android 5.0 大于安卓4.4
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!