沉浸式状态栏解析

2017-06-24  本文已影响98人  keyboard3

基础知识:

用过度重绘就可以很明显的看到这个结论
借用黄老师的掌阅来说明这个问题。

未滚动前,状态栏绘制是没有颜色的
滚动后,可以明显的看到在状态栏底部绘制了我们的window的内容

着色状态栏

Android api 19-20

1. 全屏设置 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
2. 通过 fitsSystemWindows=true 保留 padding,设置 window 的背景色
2. 或者在 decorView 上添加 View 设置背景色
1.getWindow().setStatusBarColor(Color.RED) 即 colorPrimaryDark

渐变状态栏

Android api 19-20

1. 全屏设置 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
2. 通过 fitsSystemWindows=true 保留 padding,设置 window 渐变的 Drawable
1. 全屏设置 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
2. StatusBar 颜色透明 getWindow().setStatusBarColor(Color.TRANSPARENT);
3. 通过 fitsSystemWindows=true 保留 padding,设置 window 的渐变的 Drawable

背景状态栏

Android api 19-20

1. 全屏设置 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
2. 通过 fitsSystemWindows=true 保留 padding, 设置 window 的背景图
1. 全屏设置 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
2. StatusBar 颜色透明 getWindow().setStatusBarColor(Color.TRANSPARENT);
3. 通过 fitsSystemWindows=true 保留 padding,设置 window 的背景图

最后案例

直接在theme中设置fitsSystemWindows

<item name="android:fitsSystemWindows">true</item>

建议在BaseActivity中的onCreate设置

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setStatusBarColor(Color.TRANSPARENT);
            getWindow().getDecorView()
                    .setSystemUiVisibility(
                            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
        getWindow().setBackgroundDrawableResource(R.drawable.bg_bar);

感谢

全屏、沉浸式、fitSystemWindow使用及原理分析:全方位控制“沉浸式”的实现

上一篇下一篇

猜你喜欢

热点阅读