Android

Android 状态栏(沉浸式状态栏 Immersive Sta

2020-08-18  本文已影响0人  可乐_JS
效果图
1.设置window全屏、状态栏透明、让应用主体占据状态栏空间
    /**
     * 设置状态栏透明
     *
     * @param act
     */
    public void setTranslucentStatus(Activity act) {
        if (null == act) {
            return;
        }
        Window window = act.getWindow();
        if (null == window) {
            return;
        }
        // 5.0以上系统状态栏透明
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }
2.设置根布局请求系统预留状态栏高度的padding值
      android:fitsSystemWindows="true"
3.设置需要的状态栏的颜色或者图片
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_FFFFFF"
        android:fitsSystemWindows="true">

        ……省略
    </FrameLayout>
    <!-- APP主题-->
    <style name="TransparentTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@drawable/window_background</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

注意:上述关于设置状态栏的适用于5.0及以上的系统

补充-200923

今天在跑5.1的手机的时候使用theme+图片设置的背景的图片被拉升的不像样子了!!!裹紧我的小被子~~~

试了下api23以下的都是会被拉升的,被拉升的样子很夸张,也没精力去研究,所以就简单记录下

又不想改实现方式,所以就在原来的基础上改,把图片从之前的item中放到了bitmap里边,然后加上gravity和边距的修饰,终于达到了想要的效果,具体修改如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="MissingDefaultResource">
    <item android:drawable="@color/color_FFFFFF" />
    <item android:gravity="top">
        <layer-list>
            <item android:drawable="@drawable/ic_top_big_bg" />
            <item
                android:drawable="@drawable/ic_top_bg_center"
                android:gravity="center" />
        </layer-list>
    </item>
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="MissingDefaultResource">
    <item android:drawable="@color/color_FFFFFF" />
    <item android:gravity="top">
        <layer-list>
            <item android:gravity="top">
                <bitmap
                    android:gravity="fill_horizontal|top"
                    android:src="@drawable/ic_top_big_bg" />
            </item>
            <item
                android:gravity="top"
                android:top="@dimen/dp_85">
                <bitmap
                    android:gravity="center_horizontal|top"
                    android:src="@drawable/ic_top_bg_center" />
            </item>
        </layer-list>
    </item>
</layer-list>

实现可能比较low,但是实在是不想改了,要不是公司给的测试机是5.1的都不想适配哈哈哈~~~

更新20210224

沉浸式状态栏的最新实现(sdk>=19):

1.对Activity设置:

<item name="android:windowTranslucentStatus">true</item>
或者
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
   getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

    //上面设置的状态栏为半透明,透明状态栏设置
    public static void transparentStatusBar(final Window window) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            int option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
            int vis = window.getDecorView().getSystemUiVisibility();
            window.getDecorView().setSystemUiVisibility(option | vis);
            window.setStatusBarColor(Color.TRANSPARENT);
        } else {
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

2.在顶层需要占据状态栏的布局中设置:

android:fitsSystemWindows="true"

参考文档

https://blog.csdn.net/qq_34681580/article/details/103955191

有更好的解决方案的同学,欢迎指导~
上一篇下一篇

猜你喜欢

热点阅读