51

安卓状态栏适配技巧

 5 years ago
source link: https://yangjiantao.github.io/2018/10/06/安卓状态栏适配技巧/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

公司长期以来只有一套UI稿,而且是按照iOS标准来设计的,状态栏效果自然是白底黑字。无奈啊,不过没办法,所以想着怎么也得适配一下。经过调研后得知:Android5.0以上系统版本可以修改状态栏颜色,但是只有部分小米的MIUI、魅族的Flyme和Android6.0以上系统可以把状态栏文字和图标换成深色,其他的系统状态栏文字默认都是白色的,换成浅色背景的话字体和图标就看不到;所以我们适配的前提是系统能将状态栏字体设置成深(黑)色。

我司App适配后效果对比

before after 3QVNber.jpg!webe2UNjm2.jpg!webvQRvuy3.jpg!webbu6Fjay.jpg!web

适配方案

状态栏浅色背景(比如白底黑字)

  • 安卓版本6.0及以上直接使用系统api,style里面配置。
  • 系统版本在4.4和6.0之间,特殊处理MIUI6+和Flyme4+;
  • 沉浸式和全屏模式需单独处理。
  • 其它情况不处理。(系统默认深色背景+白色字体。)

状态栏深色背景(能明显看到状态栏白色字体)

由于系统状态栏上字体默认就是白色的,只需更改背景色就能完成适配。

  • 系统版本5.0及以上使用系统API设置状态栏颜色。
  • 系统版本为4.4,使用 WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS 属性,伪造一个状态栏高度的view并设置其背景色。
  • 沉浸式和全屏模式需单独处理。

代码实现

下面代码就以状态栏浅色背景为例作简单示范;状态栏为深色背景时较简单,读者可根据文末提供的代码参考,自行完成适配。

  • 普通页面适配(逻辑建议放在BaseActivity中,特殊页面覆盖其方法实现即可)
// BaseActivity中定义方法
    /**
     * 配置沉浸式模式
     */
    protected void configImmersiveMode(){
        ImmersiveModeUtil.setDefaultImmersiveMode(this);
    }
    
    
// ImmersiveModeUtil 工具类
    /**
     * App默认的沉浸式默认
     *
     * @param activity
     */
    public static void setDefaultImmersiveMode(@NonNull Activity activity) {
        // 设置状态栏和darkMode,如果设置成功,则设置状态栏背景为白色即可。
        final boolean darkMode = setStatusBarDarkMode(activity, true);
        if (darkMode) {
            setStatusBarBgColor(activity, Color.WHITE);
        }
    }
    
     /**
     * 先判断MIUI系统,然后Flyme,最后主流系统
     *
     * @param activity
     * @param isFontColorDark 深色字体(Light)模式
     * @return 是否设置成功
     */
    @TargetApi(Build.VERSION_CODES.M)
    public static boolean setStatusBarDarkMode(@NonNull Activity activity, boolean isFontColorDark) {
        boolean result = setMIUIStatusBarDarkIcon(activity, isFontColorDark);
        if (!result) {
            result = setMeizuStatusBarDarkIcon(activity, isFontColorDark);
            if (!result) {
                result = setCommonStatusBarDarkMode(activity, isFontColorDark);
            }
        }
        if (result) {
            currentStatusBarStyle = isFontColorDark ? 2 : 1;
        }
        return result;
    }

以上代码,重点在于setStatusBarDarkMode()方法逻辑。先解释下参数 isFontColorDark 的意思, true表示状态栏中字体和icon显示为深色(黑色),false则显示成白色 (也就是系统默认样式)。这里可以看到, 在setStatusBarDarkMode()方法中,先设置MIUI系统,如果失败,继续设置魅族系统,如果又失败,就调用6.0以上官方API;其中任何一个方法成功则直接返回。 再看setDefaultImmersiveMode()方法,只有在设置darkMode返回成功的情况下才设置状态栏背景为白色;换句话说,如果系统不支持darkMode,则放弃适配。

  • 状态栏背景全透明、沉浸式和全屏模式等处理

    这种情况只需调用setSystemUiVisibility()方法就能搞定,状态栏背景设置官方5.0也有api支持,4.4系统可添加 WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS亦能实现。

这里就不贴代码了,具体可参看文末提供的demo工程代码。

注意点:

  1. 如果内容区域为全屏(显示到状态栏下面),建议使用paddingTop一个状态栏高度的view来实现。如果界面中没有输入框,也可使用 android:fitsSystemWindows="true" 属性适配。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK