Android 「透明栏」 Or 「沉浸式顶栏」

随着越来越多的人注重Material Design,对于界面的设计也有了更高的要求,于是就出现了如下图那样的各种美丽界面

效果展示.png

对于上面的效果,在网上有着不同的称呼方式,有的称之为“沉浸式”,有的称之为"透明状态栏",至于到底叫什么我们就不追究了,有兴趣的可以看看这两篇文章。
Android状态栏微技巧,带你真正理解沉浸式模式
为什么在国内会有很多用户把「透明栏」(Translucent Bars)称作 「沉浸式顶栏」?
在此我们以最简单的方式来称呼它们,第一种效果称为全屏模式,因为界面的图片进入到了状态栏里面;第二种效果称为着色模式,因为状态栏的颜色被我们改变了。

着色模式的实现

因为这个设计是最常见的,所以就先谈它的实现方式。我们通过收集阅读一些前辈的资料,可以轻松的在4.4以上的系统实现这种效果。在此我就不在赘述了,具体的可以参考以下几篇文章:
Android 沉浸式状态栏攻略 让你的状态栏变色吧
Android App 沉浸式状态栏解决方案
Android-transulcent-status-bar
Android开发:Translucent System Bar 的最佳实践

通过上面几篇文章基本上可以实现着色模式。在此我就简单的总结一下:

方法一:

1.先在values文件夹下的styles.xml 文件中设置如下主题

<style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppTheme" parent="@style/BaseAppTheme" />

2.在values-v19文件夹下的styles.xml 文件中设置如下主题

<style name="AppTheme" parent="@style/BaseAppTheme" >
    <!--状态栏透明-->
    <item name="android:windowTranslucentStatus">true</item>
</style>

3.将相应的Activity主题设置成为AppTheme

<activity android:name=".color.ColorActivity1"
    android:theme="@style/AppTheme">
</activity>

4.在Activity中对toolbar进行相关设置

Toolbar toolbar = (Toolbar) findViewById(R.id.id_toolbar);
// 必须的设置,不然会混淆状态栏
setSupportActionBar(toolbar);

最终的效果图如下(左边是4.4,右边是6.0):

左边是4.4,右边是6.0.png

可以看出在4.4上的效果和在6.0上是不一样的。在5.0以上的可以通过直接修改主题中的colorPrimaryDark,就可以直接修改到状态栏的颜色。而想要在4.4上修改状态栏的颜色就需要做更多的工作了。具体怎么做请继续往下看。

方法二(借助工具类):

因为该工具类比较完整,所以只用设置下面一句话就ok了

StatusBarUtil.setColor(ColorActivity2.this, getResources().getColor(R.color.colorPrimaryDark));

最终的效果图如下(左边是4.4,右边是6.0):


左边是4.4,右边是6.0.png

在此可以看出4.4和6.0上的效果是一样的了,而且可以直接用代码设置状态栏的颜色。

图片模式的实现

图片模式的实现其实也不难,如果只是用于效果展示,按照着色模式的方法一就可以实现,当然借助开源的工具类也是很容易实现的。但是,想要做一些动画效果,似乎就比较困难了


动画.gif

在5.0以上可以借助开源项目的工具类实现,但是在4.4上似乎还没有找到好用的库。所以我自己琢磨了一下:
1.在values-v19文件夹下的styles.xml 文件中设置如下主题

 <style name="AppTheme.NoActionBar" parent="@style/BaseAppTheme">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

2.将相应的Activity主题设置成为AppTheme.NoActionBar

<activity android:name="com.whyalwaysmea.systembar.picture.PictureActivity2"
        android:theme="@style/AppTheme.NoActionBar">
</activity>  

3.在Activity中添加如下代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
            // 设置全屏,并且不会Activity的布局让出状态栏的空间
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_picture2);
        // 使用工具类让在5.0以上的系统生效
        StatusBarUtil.setTransparent(this);
        // 这两句是在4.4系统上生效的关键
        CollapsingToolbarLayout toolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsingToolbarLayout);
        materialCollapsingForKitkat(toolbarLayout);
    }
    private void materialCollapsingForKitkat(final CollapsingToolbarLayout toolbarLayout) {
        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {

            // 设置Toolbar对顶部的距离
            final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            final FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) toolbar
                    .getLayoutParams();
            layoutParams.topMargin = MeasureUtil.getStatusBarHeight(this);
        }
    }

通过这样的设置,在4.4以及4.4以上的系统上基本上就能够达到大多数效果了。

4.4效果图.gif

总结

不管是透明栏还是沉浸式,能够实现效果就是好的。但是由于本人能力有限,所以可能存在部分机型上会有不适配的效果,如果发生不适配的可以大家一起交流。如果有问题也可以大家一起交流。

附上本次总结的代码:
AndroidDemos

其他相关文章推荐:
Android 沉浸式状态栏攻略 让你的状态栏变色吧
Android App 沉浸式状态栏解决方案
Android-transulcent-status-bar
Android开发:Translucent System Bar 的最佳实践
Android 状态栏着色实践

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • 前言 首先请大家看几张图: 以上的效果,一般我们统称为沉浸式状态栏。其实,这种叫法不是很准确,而且也没有沉浸式状态...
    宇是我阅读 3,652评论 2 28
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,433评论 22 663
  • 似水流年 渐渐消逝的怀念 可曾记得那年我们把酒言欢 青春岁月 恰似盛放的昙花 虽然美丽却短暂地让人遗憾 皎皎孤月 ...
    星河白鹭阅读 144评论 1 2
  • Fast.com 结果偏差较大 SpeedTest.net 结果比较准确 SpeedTest.cn 结果偏差较大 ...
    我是柯南阅读 693评论 0 0