沉浸、透明及白底黑字状态栏技巧

我们知道,Android5.0以上已经可以通过设置colorPrimaryDark来改变状态栏的颜色。但是,大多数Android开发者都会遇到让系统状态栏透明或者半透明的需求,如下图所示:

透明
半透明

读这篇文章之前建议研读郭神的Android状态栏微技巧,带你真正理解沉浸式模式。这里我们坚决不考虑4.4以下的系统,那么基本上可以分为几种情况,4.4、 5.0以上6.0以下、 6.0+。

本篇文章目录:
1.透明与半透明状态栏
2.结合Toolbar使用技巧
3.白底黑字状态栏
4.其他注意事项

透明与半透明状态栏

首先我们实现上边两图的效果,注意下版本的判断,直接上代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    View decorView = getWindow().getDecorView();
    int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
    decorView.setSystemUiVisibility(option);
    getWindow().setStatusBarColor(Color.TRANSPARENT);
    //getWindow().setStatusBarColor(Color.parseColor("#40000000"));  //此种效果为类似QQ的半透明状态栏
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

版本号为21以上时,效果便如上边两图所示,4.4系统则如下图所示:

4.4效果

结合标题栏使用的技巧

上述方法基本上已经实现了透明状态栏的效果,但是我们添加一个Toolbar,设置各种属性后,各种元素都上移了,如下图所示:

上移效果

部分开发者用android:fitsSystemWindows = "true",然后给状态栏添加一个View来解决,经本人各种实验后,发现这种方法不太适合自己。
这里采用一个比较直接的方式,设置透明后相当于toolbar已经被拉长,所以为其设置一个padding值来解决问题,代码如下,ScreenUtils为获取屏幕属性的一个工具类:

mToolbar = (Toolbar) findViewById(R.id.toolbar_common);
if (mToolbar != null) {
    mToolbar.getLayoutParams().height += ScreenUtils.getStatusHeight(getApplicationContext());
    mToolbar.setPadding(0, ScreenUtils.getStatusHeight(getApplicationContext()), 0, 0);
    setSupportActionBar(mToolbar);
    ActionBar supportActionBar = getSupportActionBar();
    if (supportActionBar != null) {
        supportActionBar.setDisplayShowTitleEnabled(false);  //此处是为了不显示默认的标题
    }
}

设置之后,就达到我们想要的效果了。

白底黑字状态栏

有时候我们的toolbar背景为浅色甚至是白色,如果不加修饰的话,状态栏的文字由于默认白色,导致很难分辨。6.0以上系统直接提供了方法,但是考虑到其他版本,需要具体判断:

//设置状态栏文字为暗色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    //6.0以上可以通过直接设置SYSTEM_UI_FLAG_LIGHT_STATUS_BAR属性即可。
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().setStatusBarColor(Color.GRAY);  //21以上不支持6.0直接设置的方法,可用灰色代替,具体可自己设置
    //getWindow().setStatusBarColor(Color.parseColor("#40000000"));
} else  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);//4.4版本本身就含有暗色阴影,不作其他处理即可
}

效果图如下:

6.0效果:
6.0白色

5.0以上6.0以下:
5.0以上6.0以下

4.4效果:
4.4效果

注意事项

上述方法基本上已经可以满足大部分需求了,效果都可以称为(半)透明状态栏。下边看看真正的沉浸式状态栏,状态栏文字和导航栏都被隐藏:

沉浸

代码如下:


@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_FULLSCREEN
        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
}

实际开发中,我们当然不可能每个Activity中都写一大堆重复的代码,所以建议讲透明状态栏的代码封装在BaseActivity中,然后Toolbar设置相同的id,或者使用<include>标签公用,自定义的一个布局或者其他View也是同理。
Demo中做了一些简单的封装,可以参考下,具体实现还是需要看具体的需求。

本文所有代码的地址,戳 我的Github ,在StatusBar包中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,858评论 25 707
  • 前言 首先请大家看几张图: 以上的效果,一般我们统称为沉浸式状态栏。其实,这种叫法不是很准确,而且也没有沉浸式状态...
    宇是我阅读 3,823评论 2 28
  • 首先,我要实现的最终效果是这样的,即在Android4.4及以上版本系统上,统一显示为如下效果: 所谓“沉浸式”状...
    星际之痕阅读 2,529评论 8 27
  • 应用市场上App越来越多的出现沉浸式状态栏的设计(如下图所示)状态栏和导航栏具有相同的颜色。Android在4.4...
    Jensen95阅读 1,561评论 2 13
  • 0前言 之前听朋友推荐过链家网,于是这次找工作,我优先投了他们的简历。紧接着收到了链家门头沟招聘负责人的电话,...
    点妞妞阅读 2,885评论 0 15