美文网首页Android
Android 状态栏(沉浸式状态栏 Immersive Sta

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

作者: 可乐_JS | 来源:发表于2020-08-18 14:33 被阅读0次
    • 可以直接看下面的:更新20210224
    • 记录最近一次关于实现带图片的沉浸式状态栏的功能实现
    效果图
    1.设置window全屏、状态栏透明、让应用主体占据状态栏空间
    • 可以在BaseActivity中,也可以写成工具类
        /**
         * 设置状态栏透明
         *
         * @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.设置需要的状态栏的颜色或者图片
    • 在BaseActivity中的根布局设置需要的背景颜色或者背景图片
        <?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>
    
    • 除了上面的方法还可以通过设置Theme的方式来设置
        <!-- 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和边距的修饰,终于达到了想要的效果,具体修改如下:

    • -之前的theme:
    <?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>
    
    • 更改后的theme:
    <?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

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

    相关文章

      网友评论

        本文标题:Android 状态栏(沉浸式状态栏 Immersive Sta

        本文链接:https://www.haomeiwen.com/subject/vvnhjktx.html