美文网首页
android沉浸式

android沉浸式

作者: SeekLife0 | 来源:发表于2022-01-10 21:15 被阅读0次

一、内容概述:

1、如何修改状态栏颜色。
2、如何修改状态栏文字颜色。
3、如何不被虚拟键隐藏,或隐藏虚拟键。
4、如何消除沉浸式。
5、如何修改导航栏内部的fragment的状态栏颜色。

二、解决方法

1、如何修改状态栏颜色。

第一种就是直接修改主题颜色

可参考:https://www.imooc.com/article/74825
在styles.xml中添加style

图片.png
    <style name="ProductExhibition" parent="AppTheme">
        //没有标题栏
        <item name="android:windowNoTitle">true</item>
        //修改背景颜色
        <item name="android:windowBackground">@color/btnColor</item>
        //修改状态栏颜色
        <item name="android:statusBarColor">@color/btnColor</item>
    </style>

在manifest.xml文件中进行配置


图片.png

第二种是直接在activity中进行设置

添加依赖

//万能工具库 --https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md
implementation 'com.blankj:utilcodex:1.30.6'
//在页面初始化的时候添加一行代码即可
BarUtils.setStatusBarColor(me, Color.parseColor("#ffffff"))

2、如何修改状态栏文字颜色

可以参考:暂无
以下内容可以直接复制到工具类中,在activity初始化的时候调用即可。文字颜色分亮色暗色,分别是白色和黑色。

/**
     *  修改状态栏文字颜色,这里小米,魅族区别对待。
     */
    public static void setLightStatusBar(final Activity activity, final boolean dark) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            switch (RomUtils.getLightStatusBarAvailableRomType()) {
                case RomUtils.AvailableRomType.MIUI:
                    MIUISetStatusBarLightMode(activity, dark);
                    break;

                case RomUtils.AvailableRomType.FLYME:
                    setFlymeLightStatusBar(activity, dark);
                    break;

                case RomUtils.AvailableRomType.ANDROID_NATIVE:
                    setAndroidNativeLightStatusBar(activity, dark);
                    break;

            }
        }
    }


    public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) {
        boolean result = false;
        Window window = activity.getWindow();
        if (window != null) {
            Class clazz = window.getClass();
            try {
                int darkModeFlag = 0;
                Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
                Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
                darkModeFlag = field.getInt(layoutParams);
                Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
                if (dark) {
                    extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体
                } else {
                    extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体
                }
                result = true;

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && RomUtils.isMiUIV7OrAbove()) {
                    //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上
                    if (dark) {
                        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                    } else {
                        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                    }
                }
            } catch (Exception e) {

            }
        }
        return result;
    }

    private static boolean setFlymeLightStatusBar(Activity activity, boolean dark) {
        boolean result = false;
        if (activity != null) {
            try {
                WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
                Field darkFlag = WindowManager.LayoutParams.class
                        .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
                Field meizuFlags = WindowManager.LayoutParams.class
                        .getDeclaredField("meizuFlags");
                darkFlag.setAccessible(true);
                meizuFlags.setAccessible(true);
                int bit = darkFlag.getInt(null);
                int value = meizuFlags.getInt(lp);
                if (dark) {
                    value |= bit;
                } else {
                    value &= ~bit;
                }
                meizuFlags.setInt(lp, value);
                activity.getWindow().setAttributes(lp);
                result = true;
            } catch (Exception e) {
            }
        }
        return result;
    }

    private static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) {
        View decor = activity.getWindow().getDecorView();
        if (dark) {
            decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        } else {
            decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        }
    }

3、如何不被虚拟遮挡,或者隐藏虚拟键

可以参考:https://www.jianshu.com/p/ce65dc7b0b56
以下方法可以放置在工具类中方便调用。
1、不隐藏底部虚拟键,不隐藏状态栏,布局顶部延伸至状态栏顶部不被虚拟键遮挡,且状态栏透明。

    /**
     * 顶部布局延伸至状态栏且状态栏透明,底部不被虚拟键遮挡
     * @param activity
     */
    public static void hideStatusBar(Activity activity) {
        if (Build.VERSION.SDK_INT < 19) { // lower api
            View v = activity.getWindow().getDecorView();
            v.setSystemUiVisibility(View.GONE);
        } else if (Build.VERSION.SDK_INT >= 19) {
            View decorView = activity.getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(uiOptions);
        }
    }

2、隐藏底部的虚拟键和状态栏

    /**
     * 180115 隐藏 魅族、Nexus、华为等底部的虚拟导航按键,避免遮挡内容
     *
     * @param activity 需要隐藏底部导航按键的Activity
     */
    public static void hideBottomUIMenu(Activity activity) {
        //隐藏虚拟按键,并且全屏
        if (Build.VERSION.SDK_INT < 19) { // lower api
            View v = activity.getWindow().getDecorView();
            v.setSystemUiVisibility(View.GONE);
        } else if (Build.VERSION.SDK_INT >= 19) {
            View decorView = activity.getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
            decorView.setSystemUiVisibility(uiOptions);
        }
    }

4、如何消除沉浸式

//在根布局中添加如下属性即可,内容将不会延伸至状态栏和虚拟键。
android:fitsSystemWindows="true"

5、如何修改导航栏内部的fragment的状态栏颜色。

fragment的状态栏颜色其实就是activity状态栏颜色,所以还是去改变activity的状态栏颜色这么一个思路。
使用第三方组件,所以添加依赖

implementation 'com.github.Vincent7Wong:EasyNavigation:2.0.0'

给导航栏控件添加tab切换事件监听,然后动态改变状态栏颜色即可,同样使用barUtils工具类。

 .setOnTabClickListener(object : EasyNavigationBar.OnTabClickListener {
      override fun onTabSelectEvent(view: View, position: Int): Boolean {
       when (position) {
          0, 2, 3, 4 -> BarUtils.setStatusBarColor(me, Color.parseColor("#ffffff"))
            else -> BarUtils.setStatusBarColor(me, Color.parseColor("#00C99D"))
        }
          return false
     }

   override fun onTabReSelectEvent(view: View, position: Int): Boolean {
                    return false
                }
    })

最后在推荐一个github上的关于沉浸式效果的组件:
https://github.com/yanzhenjie/Sofia

相关文章

  • android沉浸式状态栏 轻量 简便

    android沉浸式状态栏 android 沉浸式状态栏 网上看了很多沉浸式,感觉用起来麻烦,而且有些库非常大,于...

  • Android学习目录

    Theme风格 Android 沉浸式风格(为毛叫沉浸式这么唬人) Build编译 Android 多渠道打包(同...

  • Android 沉浸式模式与常见状态栏和导航栏效果

    Android沉浸式模式 官方称沉浸式状态栏为沉浸式模式。 什么是沉浸式?沉浸式就是让人专注当前的(由设计者营造)...

  • Android 补充 LayerDrawable 沉浸式状态栏

    小菜前些日子整理了两次小小的沉浸式状态栏的总结:Android 沉浸式状态栏的多种样式 和 Android 沉浸式...

  • android沉浸式状态栏

    android沉浸式状态栏 参考文章 另外两种android沉浸式状态栏实现思路 android4.4+实现MD状...

  • AndroidView

    Android 沉浸式 (透明) 状态栏适配 Android 沉浸式状态栏仿淘宝、京东拖拽商品详情(可嵌套View...

  • android沉浸式

    一、内容概述: 1、如何修改状态栏颜色。2、如何修改状态栏文字颜色。3、如何不被虚拟键隐藏,或隐藏虚拟键。4、如何...

  • Android沉浸式状态栏技术方案调研与实现

    参考资料: Android关于沉浸式状态栏总结 Android 沉浸式状态栏完美解决方案 项目Demo GitHu...

  • 沉浸式状态栏

    1、1218683832/ImmersionBar android 4.4以上沉浸式状态栏和沉浸式导航栏管理,适配...

  • 沉浸式状态栏

    在Android4.4之后开始支持沉浸式状态栏,如下图 (1)起初Android4.4(API19)开始实现沉浸式...

网友评论

      本文标题:android沉浸式

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