zoukankan      html  css  js  c++  java
  • 白底黑字!Android浅色状态栏黑色字体模式(另)

     

    96 
    小彬什么都想做任重致远 
    2016.06.30 10:16* 字数 489 阅读 3234评论 3

    前言

    由于该死不死的设计湿,设计了一套白色状态栏的UI。当然在iOS上可以实现自适应,但是安卓上比较麻烦,所以一直没有搞。最近看到一篇文章《白底黑字!Android浅色状态栏黑色字体模式》里面提及到解决办法,才豁然开朗。

    MIUI 8.0截图


     
    Screenshot_2016-06-30-09-39-51-101_com.linkit.lan.png

    懒得打字,引用原作者的话

    在Android6.0才开始支持SYSTEM_UI_FLAG_LIGHT_STATUS_BAR可以将状态栏图标改为灰色。

    而Android4.4以上系统版本可以修改状态栏颜色,但是只有小米的MIUI、魅族的Flyme和Android6.0以上系统可以把状态栏文字和图标换成深色,其他的系统状态栏文字都是白色的,换成浅色背景的话就看不到。

    适配浅色状态栏深色字体的时候发现底层版本为Android6.0的MIUI系统不支持SYSTEM_UI_FLAG_LIGHT_STATUS_BAR设置,还是得用MIUI自己的深色字体方法。三方Android系统对底层改的挺乱的,也是让人头痛。O__O

    导入1(如需要支持Android4.4的状态栏变色,不需要则跳过这步)

    在 build.gradle添加依赖:

    dependencies {
        compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
    }
    

    或者直接导入这个类:
    https://github.com/jgilfelt/SystemBarTint/blob/master/library/src/com/readystatesoftware/systembartint/SystemBarTintManager.java

    导入2(如不需要支持Android4.4,把SystemBarTintManager部分去掉)

    这里说一下,miui的K,L,M三个Android版本我都测试过了,但是由于没有魅族的机子所以还没测试过,也没有找到EMUI的实现方法。这里引用了原作者的方法,并整合了一下。

        //白色可以替换成其他浅色系
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public static void myStatusBar(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                if (MIUISetStatusBarLightMode(activity.getWindow(), true)) {//MIUI
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0
                        activity.getWindow().setStatusBarColor(Color.WHITE);
                    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4
                        activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                        SystemBarTintManager tintManager = new SystemBarTintManager(activity);
                        tintManager.setStatusBarTintEnabled(true);
                        tintManager.setStatusBarTintResource(android.R.color.white);
                    }
                } else if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) {//Flyme
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0
                        activity.getWindow().setStatusBarColor(Color.WHITE);
                    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4
                        activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                        SystemBarTintManager tintManager = new SystemBarTintManager(activity);
                        tintManager.setStatusBarTintEnabled(true);
                        tintManager.setStatusBarTintResource(android.R.color.white);
                    }
                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//6.0
                    activity.getWindow().setStatusBarColor(Color.WHITE);
                    activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                }
            }
        }
    
        /**
         * 设置状态栏字体图标为深色,需要MIUIV6以上
         *
         * @param window 需要设置的窗口
         * @param dark   是否把状态栏字体及图标颜色设置为深色
         * @return boolean 成功执行返回true
         */
        public static boolean MIUISetStatusBarLightMode(Window window, boolean dark) {
            boolean result = false;
            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;
                } catch (Exception e) {
    
                }
            }
            return result;
        }
    
        /**
         * 设置状态栏图标为深色和魅族特定的文字风格
         * 可以用来判断是否为Flyme用户
         *
         * @param window 需要设置的窗口
         * @param dark   是否把状态栏字体及图标颜色设置为深色
         * @return boolean 成功执行返回true
         */
        public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {
            boolean result = false;
            if (window != null) {
                try {
                    WindowManager.LayoutParams lp = window.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);
                    window.setAttributes(lp);
                    result = true;
                } catch (Exception e) {
    
                }
            }
            return result;
        }
    

    参考文章

    原文1:白底黑字!Android浅色状态栏黑色字体模式
    原文2:Android 6.0状态栏使用灰色文字和图标

  • 相关阅读:
    MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)
    MySql cmd下的学习笔记 —— 有关视图的操作(algorithm)
    MySql cmd下的学习笔记 —— 有关视图的操作(建立表)
    MySql cmd下的学习笔记 —— 有关常用函数的介绍(数学函数,聚合函数等等)
    MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)
    MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
    MySql cmd下的学习笔记 —— 有关子查询的操作(where型,from型,exists型子查询)
    MySql cmd下的学习笔记 —— 有关select的操作(order by,limit)
    剑指Offer--第21题 调整数组顺序使奇数位于偶数前面;
    剑指Offer--和为s的连续正数序列
  • 原文地址:https://www.cnblogs.com/lenkevin/p/8185620.html
Copyright © 2011-2022 走看看