美文网首页Android DevAndroidiOS && Android
Android开发:Translucent System Bar

Android开发:Translucent System Bar

作者: ec95b5891948 | 来源:发表于2016-02-04 17:49 被阅读47444次

Translucent System Bar 的最佳实践

近几天准备抽空总结Android一些系统UI的实践使用,于是开始动手建了一个库 AndroidSystemUiTraining ,边撸代码边写总结

今天开写第一篇,对 Translucent System Bar 的实践做一些总结。说起 Translucent System Bar 的特性,可能有些朋友还比较陌生,这里做一下简单的介绍。

Android 4.3豌豆荚

看上图,Android 4.4之前,即使我们打开手机app,我们还总是能看到系统顶部那条黑乎乎的通知栏,这样会使得app稍显突兀。于是Android 4.4开始,便引入了Translucent System Bar的系特性,用于弥补系统通知栏突兀之处。(估计也是向ios学习,因为ios一大早就有这个特性)。我们先来看看 Translucent System Bar 新特性引入后,发生了什么样的变化。下面截取了 中华万年历的天气预报界面QQ音乐主界面 的效果(两个界面的效果实现 Translucent System Bar 的方式有些区别,下文会细讲)

中华万年历 QQ音乐

可以看到,系统的通知栏和app界面融为一体,妈妈再也不用面对黑乎乎的通知栏了。有关 Translucent System Bar 的特性就暂且介绍到此。

工程简介

先简单介绍一下工程的结构,核心部分已经圈出,待我逐一讲解

工程结构
  • 主要的操作都在style.xml 和 AndroidManifest.xml 中,Activity里面没有任何涉及到Translucent System Bar设置的代码,所以可以忽略不看。

  • ColorTranslucentBarActivity 和 ImageTranslucentBarActivity 分别用于展示两种不同实现方式的效果

  • 要在Activity中使用 Translucent System Bar 特性,首先需要到AndroidManifest中为指定的Activity设置Theme。但是需要注意的是,我们不能直接在values/style.xml直接去自定义 Translucet System Bar 的Theme,因为改特性仅兼容 Android 4.4 开始的平台,所以直接在values/style.xml声明引入,工程会报错。有些开发者朋友会在代码中去判断SDK的版本,然后再用代码设置Theme。虽然同样可以实现效果,但个人并不推崇这种做法。我所采取的方法则是建立多个SDK版本的values文件夹,系统会根据SDK的版本选择合适的Theme进行设置。大家可以看到上面我的工程里面有valuesvalues-v19values-v21

第一种方式

第一种方式,需要做下面三步设置

1、在valuesvalues-v19values-v21的style.xml都设置一个 Translucent System Bar 风格的Theme

values/style.xml


<style name="ImageTranslucentTheme" parent="AppTheme">
    <!--在Android 4.4之前的版本上运行,直接跟随系统主题-->
</style>

values-v19/style.xml


<style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
</style>

values-v21/style.xml


<style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

上面需要注意的地方是,无论你在哪个SDK版本的values目录下,设置了主题,都应该在最基本的values下设置一个同名的主题。这样才能确保你的app能够正常运行在 Android 4.4 以下的设备。否则,肯定会报找不到Theme的错误。

2、在AndroidManifest.xml中对指定Activity的theme进行设置


<activity
    android:name=".ui.ImageTranslucentBarActivity"
    android:label="@string/image_translucent_bar"
    android:theme="@style/ImageTranslucentTheme" />

3、在Activity的布局文件中设置背景图片,同时,需要把android:fitsSystemWindows设置为true

activity_image_translucent_bar.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@mipmap/env_bg"
    android:fitsSystemWindows="true">

</RelativeLayout>

到此,第一种实现方式完成,大家可以看看下面的效果

ImageTranslucentTheme效果

就跟中华万年历的天气预报效果界面一样,系统的整个导航栏都融入了app的界面中,背景图片填满了整个屏幕,看起来舒服很多。这里还有一个android:fitsSystemWindows设置需要注意的地方,后面会在细讲。接下来看第二种实现。

方式二

相比中华万年历,QQ音乐采用的是另外一种实现的方式,它将app的Tab栏和系统导航栏分开来设置。

QQ音乐效果风格

由于它的Tab栏是纯色的,所以只要把系统通知栏的颜色设置和Tab栏的颜色一致即可,实现上相比方法一要简单很多。同样要到不同SDK版本的values下,创建一个同名的theme,在values-v21下,需要设置系统导航栏的颜色:

values-v21/style.xml


<style name="ColorTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <item name="android:statusBarColor">@color/color_31c27c</item>
</style>

再到ColorTranslucentBarActivity的布局文件activity_color_translucent_bar.xml中设置Tab栏的颜色


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:background="@color/color_31c27c">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="QQ Music"
            android:textColor="@android:color/white"
            android:textSize="20sp" />

    </RelativeLayout>
</LinearLayout>

到此,我们就可以得到和QQ音乐主界面一样的效果了。

QQ音乐界面实现效果

到此,就大体介绍完了 Translucent System Bar 的两种实现方式了。

android:fitsSystemWindows的“踩坑”

通过前面的两种方式,大家估计会留意到一个地方,就是所有实现 Translucent System Bar 效果的Activity,都需要在根布局里设置 android:fitsSystemWindows="true" 。设置了该属性的作用在于,不会让系统导航栏和我们app的UI重叠,导致交互问题。这样说可能比较抽象,看看下面两个效果图的对比就知道了。

有fitsSystemWindows设置 没有fitsSystemWindows设置

注:上面的演示效果,是借助了我的另一个开源项目,详情请戳:AndroidAlbum

这样的话,如果我有10个Activity要实现这种效果,就要在10个布局文件中做设置,非常麻烦。所以,想到一种方法,在theme中加上如下的android:fitsSystemWindows设置:


<item name="android:fitsSystemWindows">true</item>

发现果真可以了。所有要实现 Translucent System Bar 的Activity,只需要设置了这个theme即可,改起来也很方便。可惜,后来出现了一个BUG,让我还是得老老实实的回去布局文件中设置。

Toast文字错位

Toast打印出来的文字都往上偏移了。这里也是我疏忽的地方,因为在布局文件中设置是对View生效,而到了theme进行设置则是对Window生效了,两者在实现上就不一样了。所以,最终只能改回原来的方式去实现。

实践总结

最后做一下小小的总结:

  • 方式一适用于app中没有导航栏,且整体的背景是一张图片的界面;
  • 方式二适用于app中导航栏颜色为纯色的界面;
  • android:fitsSystemWindows设置要在布局文件中,不要到theme中设置;

怎样,介绍到这里,你会使用 Translucent System Bar 了吗?赶快到你的app中引入吧!

补充更新(2016-02-19)

一些热心的网友反馈,在Android 4.4平台上使用第二种方法失效。我立马跑到Android4.4的真机运行一遍,果真出现下面的bug,顶部变成黑白渐变了。

4.4平台上第二种方案出现的BUG

在此,先为自己的疏忽向广大读者说声抱歉。以后会最大程度的避免这种低级错误的产生。下面给出此Bug的修复方案:

第一步:去到 ColorTranslucentBarActivity 的布局文件中,将布局划分成为标题布局内容布局两部分;

第二步:将 ColorTranslucentBarActivity 的根布局颜色设置与标题布局的颜色一致,并将内容布局设置为白色;


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/color_31c27c"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <!--标题布局-->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:background="@color/color_31c27c">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="QQ Music"
            android:textColor="@android:color/white"
            android:textSize="20sp" />

    </RelativeLayout>

    <!--内容布局-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white"
        android:orientation="vertical">

        <Button
            android:id="@+id/btn_show_toast"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Show a toast" />
    </LinearLayout>

</LinearLayout>

经过以上两步,即可在 4.4 平台上实现 Translucent System Bar 的效果 。最后附上修复bug后的效果图一张。

Android 4.4平台bug修复后的效果图

补充更新(2016-02-22)

很多童鞋反应,在每个布局文件中都要写上 android:fitsSystemWindows="true" ,有没有更佳方便的方法,本人当时没有思路。今天收到coder_sharp 童鞋反馈的一种更为简便的思路

coder_sharp童鞋提供的新思路

个人把他的思路,整理成代码,如下:


public abstract class TranslucentBarBaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(getLayoutResId());//把设置布局文件的操作交给继承的子类

        ViewGroup contentFrameLayout = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);
        View parentView = contentFrameLayout.getChildAt(0);
        if (parentView != null && Build.VERSION.SDK_INT >= 14) {
            parentView.setFitsSystemWindows(true);
        }
    }

    /**
     * 返回当前Activity布局文件的id
     *
     * @return
     */
    abstract protected int getLayoutResId();
}

所有需要实现效果的界面继承以上的父类,并实现 getLayoutResId 抽象方法即可,就可以不用在布局文件中不断做重复操作了,具体代码详见工程中的 TranslucentBarBaseActivityBestTranslucentBarActivity

补充更新(2016-02-25)

近几天在琢磨 Material Design 的一些新控件效果,意外的发现上面提到的第二种方式,在将原 values-v21/style.xml


<style name="ColorTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ....
    .... 
    <item name="android:statusBarColor">@color/color_31c27c</item>

</style>

换成


<style name="ColorTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ....
    .... 
    <item name="android:statusBarColor">@android:color/transparent</item>

</style>

之后,依旧可以实现同样的效果。那么,到了这里你就可以发现,上面提到的两种方式从本质上其实是殊途同归(最终总结得到的就是一种方式)!

我是热爱技术,喜欢开源和分享的Clock,很享受写文和其他开发者们探讨问题的乐趣,其中很多bug都是其他细心的开发者发现的。如果你对我写的内容感兴趣,欢迎关注我的简书,我很乐意把我开发中一些有趣的东西分享到简书中来(虽然目前仅仅是Android,但相信以后肯定会有其他内容的),希望与其他开发者共同探讨,共同进步!

分享即美德,最后附上源代码地址:
https://github.com/D-clock/AndroidSystemUiTraining

欢迎关注我的简书,以及:

相关文章

网友评论

  • 0c45406e8da8:文章很棒。我们侠课岛正好在找远程录制课程视频或图文教程的朋友,我们会给到课程的需求大纲,每一节课程需要你来详细展开写一些代码举例和讲解清楚,对经验积累和创新能力有一定的要求。有兴趣联系我,微信:zhimadt
  • 2d0f761aa0bd:你好,我的工程里原先没有values-21,新增后报此文件多余,怎么办啊?不好意思啊,我是新手
  • sdjvsjjsc:CoordinatorLayout+AppBarLayout+RecyclerView ,上滑之后,AppBarLayout跑到状态栏上面了,并且显示的高度为元高度的一半,这个是怎么回事呢。app:layout_scrollFlags="scroll|enterAlways" app:layout_behavior="@string/appbar_scrolling_view_behavior"
    木溪bo:解决了吗,兄弟
  • TonyEasy:楼主你好!我发现一个问题,在华为7.0机器上,似乎
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:windowTranslucentNavigation">true</item>
    透明状态栏和底部导航栏透明问题不能同时解决,上面这样设置底部导航栏显示异常,底部页面被导航栏遮住,
    比如如果设置
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">false</item>
    则出现的效果是透明状态栏无效,底部导航栏显示正常
    如果设置
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:windowTranslucentNavigation">false</item>
    则透明状态栏也无效,底部状态栏显示正常,请问如何实现透明状态栏和底部状态栏显示正常
  • TonyEasy:楼主有没有使用华为手机,现在华为mate10 p9出现了底部导航栏变透明,如果<item name="android:windowTranslucentNavigation">true</item> 改为false后,则顶部状态栏无法实现透明效果,很矛盾
  • 702999c7df13:楼主能适配Android N吗
  • 666swb:使用方式一, android:fitsSystemWindows="true"加入这个代码,测试发现状态栏出现灰色的,不加入这个代码,反而是好的, 有点困惑
    666swb:看了您的代码,你的第一个图片例子,布局文件是图片直接作为根布局的背景,而我的布局是根布局下面新建了imageView,然后设置背景,如果还是设置android:fitsSystemWindows="true"的话,状态栏就会出现灰色了,谢谢你的demo
  • 666swb:终于找到正解,谢谢!
  • 天煞魔猎手:好文,同遇到相同坑,还是这篇文章解决了问题
    天煞魔猎手:另外从其他文章中得到描述:"values-v19 的sytle.xml里设置windowTranslucentStatus属性为true会某些手机上不起效,所以将上面的实现改为代码实现可能会解决问题" 关于这个描述,还没有遇到过,不过先留言,希望如果有同学遇到类似问题,通过这个描述确实能解决
  • 巴黎没有摩天轮Li:最近正想研究研究这个问题。。感谢作者学习了!!!!!!
  • 曹半斤:Error:Error: Invalid resource directory name
  • B_Crt:给你好几篇文章评论了
    昂就是做SystemUI的 调API还是幸福的(当然,不能停留在这个层次),API调用的一切功能,苦逼的SystemUI都要去做实现 沉浸式,图标变色,透明,半透明参合起来是一堆的逻辑业务。。。
  • fbd7d5eb43a8:6.0的不行啊
  • wo叫天然呆:看了你的文章,你的方法是在根布局下面设置个背景色,然后在里面的子布局再设置个白色背景,这样无形中就多出了2个背景色,容易导致过度绘制,不知道是否有考虑到这方面,我研究了下,不知道要如何优化这个问题
  • yufengzungzhe:下载Demo后,安装发现我的手机没有全屏;而且状态栏还是黑色的,并没有透明。我的手机是华为Android5.1系统。楼主有没有QQ,微信可以联系吗?我的QQ:281273905
  • 9f49261a889c:楼主这个标题布局应该可以抽出来吧,是不是方便管理一些呢 :smile:
  • cf908b4323ca:留存,一会看
  • 523bf0910bc4:1:方式一中activity_image_translucent_bar.xml文件中不需要加android:fitsSystemWindows="true"
    2:方式二中的布局在4.4上肯定有一条灰白色的状态栏,不应该那样写。
  • cjcj125125:但是系统的时间颜色是无法改变的,我最近做的app也是沉浸了状态栏,但是整个app风格是白色的,系统的时间看不到了,让我怎么搞,麻痹美工一直说不一样
  • 陆仁丙:感谢博主的分享,讲解的很详细。还有不断的后续和更新,真的相当不错!!向博主学习!!
  • 98f21096254d:你好 我想实现你QQ音乐的效果 但是设置 <item name="android:statusBarColor">@android:color/transparent</item> 无效 通过设置 colorPrimaryDark 固定颜色就行了 请问下这是怎么回事
  • _ERROR:如果是有侧拉栏的界面呢
  • f8579c97e258:当过小白才知道这种有人给指明路的感激,谢谢
  • wo叫天然呆:发现一个问题,如果是有虚拟导航键的手机,ColorTranslucentTheme下,虚拟导航键也会跟着变色,我找了好久才找到虚拟导航键不跟着变色的办法http://www.jianshu.com/p/37e657cf8969
    不知道你那边是否有遇到此类问题,是否有更好的解决方法,我这个方法感觉还是有点麻烦
    wo叫天然呆:@wo叫天然呆 http://www.jianshu.com/p/c7eeebe83950
  • mrrobot97:这是Transparent Status Bar 不是 Translucent Status Bar.
  • evanwo:其实我和博主一样都是去年毕业,但是看了你的几篇文章自叹不如,希望可以持之以恒写文,其实我认为只要在最外层设置了fitsystemwindowns 和bg就可使界面沉浸式了,整个界面的颜色也是会一致,所以内容区域才要重新设置颜色
  • 我叫大西瓜:你好,我有一个问题,就是使用了你的第二种方式之后,虽然系统通知栏和actionBar颜色都同一之后,但是在手机的虚拟键的地方本身系统显示的是黑色的,但是也随着通知栏的颜色而改变了?请问这个问题怎么解决?
    wo叫天然呆:@darkShuai http://www.jianshu.com/p/c7eeebe83950 这是我的解决方案,不知道你有没有更好的
  • 954fea13db4d:我用了4.4的机器试了,状态栏比toolbar的颜色浅。6.0的状态栏和toolba颜色一致
    4.4的该怎么改正
    evanwo:@954fea13db4d 这个是因为4.4和5.0的系统状态栏不会全透明,这个不用考虑了
  • 庸碌无为:直接运行项目,image、color、best三个状态栏没有变色,手机:Vivo Xplay3s
  • 幸福就是不断的经历:我依赖的项目里面添加了v7.我在我主项目里面 supportRequestWindowFeature(Window.FEATURE_NO_TITLE);这句话就找不到.像这种情况怎么处理啊


  • Jacen:感谢分享!
  • 9c8c501d3d3b: <style name="ColorTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    </style>

    我的需要这么写才不会有标题栏
    9c8c501d3d3b:为啥你的不需要写
  • hi超级自恋男hi:关于在Android 4.4平台上使用第二种方法失效的解决方法,为什么设置了几个颜色就解决了呢?原理是什么?
  • 606fd5f5448c:厉害,学习了
  • AlphaGao:其实还存在个小bug,在activity的布局根节点中设置了fitsSystemWindows和background,在5.X以上的版本中,虚拟按键就会不再透明,本来原生虚拟键是可以透明的,硬生生少了一块显示区域。。。目前还没找到解决方式
  • hi_dhl:咨询一个问题
    一个fragment (A)添加另外一个fragment(B),A跳转到Fragment(c),
    在c中使用getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);设置全屏,但是回到A,
    结果. 如果在C退出之前,调用 getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); B就会消失
    希望:回到A 变回非全屏状态,并且B不消失
  • qiujuer:在上面你补充解决顶部颜色的地方,设置了3次背景色。可以说进行了重复渲染,而且颜色还不能为半透明的颜色,当然一般情况下不会有问题。
  • DDstar:首先感谢分享,真是一篇好文章,然后我用你最后补充的方法,新建一个BaseAct,在里面设置parent.setFitsSystemWindows(true);
    但是用图片的话就会没有效果,跟没有设置这个属性是一样的情况,请问你的会遇到这种情况吗
  • 小刘哥可爱多:如果状态栏颜色设置为白色的话,不行吧,状态栏文字为白色,看不到状态栏文字颜色了
  • 程序员Anthony:作者写的太棒了,点个赞。
    这里谈谈我的看法,达到状态栏变色有两种方法,作者的两种方式其实都是下面的第一种。
    一.修改样式文件:
    增加values-v19,value-21文件夹,再其中的styles.xml中加上 Translucent System Bar 风格的Theme。
    二.使用开源库
    使用开源库systembartint,android studio中加入依赖:
    compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'。


    需要注意的点有:
    1 作者提及的点android:fitsSystemWindows。
    2 所有的效果都需要4.4以上,4.4以下就别想了,哈哈。
    3 在4.4以上需要设置android:windowTranslucentStatus属性为true,在5.0以上设置为false或者不需要设置。当然你也可以通过代码设置。我是这样设置的。
    protected void setTranslucentStatus(boolean on) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window win = getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
    if (on) {
    winParams.flags |= bits;
    } else {
    winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
    }
    }

    在我的项目中,我一般使用第二种方法:
    依次调用下面两个方法:
    (1)上面的setTranslucentStatus方法
    (2)
    /**
    * use SystemBarTintManager to change status bar
    *
    * @param tintDrawable
    */
    protected void setSystemBarTintDrawable(Drawable tintDrawable) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    SystemBarTintManager mTintManager = new SystemBarTintManager(this);
    if (tintDrawable != null) {
    mTintManager.setStatusBarTintEnabled(true);
    mTintManager.setTintDrawable(tintDrawable);
    } else {
    mTintManager.setStatusBarTintEnabled(false);
    mTintManager.setTintDrawable(null);
    }
    }
    }
    程序员Anthony:@D_clock爱吃葱花 就整理在你的AndroidSystemUiTraining 里面吧,哈哈,很不错的集合。
    ec95b5891948:@CameloeAnthony 不错哟,systembartint的方式我还没亲自实践过,抽个时间整一整,比较一下
  • TDo:轮播图怎么实现第一种方式
  • 15c78f60fb4b:我想问一下博主,第一种做法设置了状态栏透明后,根布局是一张图,setfix为ture,不是应该没有填充状态栏吗? 我的理解是setfix为false才会填充,求解答。。。
  • TDo:对于带轮播图的页面,想实现状态栏一体化,不知道博主怎么实现的?
  • 釒彡尨:hatsu
  • Watire:围观好文 配合toolbar测试成功
  • xiaoye1993:大神 请问怎么让Activity 和 Fragment 分别控制setFitsSystemWindows属性呢
  • starryZzz:你好,请问用相同的代码为什么我在eclipse中就无法实现这个效果,在as上就可以
  • c9fdaef379df: <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
    <item name="android:statusBarColor">@android:color/transparent</item>

    6.0又出现了灰色!!!
  • 弗人:第二种方法,最后将<item name="android:statusBarColor">"@android:color/transparent"</item>之所以能生效应该是给使用这个style主题的activity根部局设置了background=“@color/color_31c27c”,如果没有设置这个background会出现4.4一样的效果。
  • forevan:楼主试过在5.1以及6.0的效果吗 貌似都不行呀~
  • f2cfa51103fc:很好,谢谢分享!
  • 8cd249b8ddf2:我最近也在帮客户的app适配透明状态栏,然后各种坑。。。。用你上面写的方式,在4.4的机器上的确可以让状态栏和titlebar一样的颜色,可是不知道为啥到5.0以上的机子,状态栏就不能透明了,只能达到半透明,求解
  • Zack_zhou:按你的方法做了一遍,我用模拟机是可以的,但是真机不行,真机是联想4.4,是不是联想做了限制啊??
  • bacy_love:window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    // | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    if (darkMode) {
    window.setStatusBarColor(Color.parseColor("#88888888"));
    } else {
    window.setStatusBarColor(Color.TRANSPARENT);
    }

    5.0上要这么玩才能全透明
  • 皮球二二:貌似你两种方案都完全依赖于background。但是WindowTransparent设置之后,你已经可以完全在没有edittext的情况下不使用fitSystemWindow,因为整个窗口布局都被你掌控
  • 皮球二二:其实我不是很赞成使用fitSystemWindow的,第一种方案那种效果只能在background才能实现,无法做到真正的全屏,因为它向下空出间隔了。而且navigationbar不能true,不然布局整体自动到其下面,根本无法操作
  • hvne666:你好,新手请教下,直接运行你的工程
    Error:(1, 0) Plugin with id 'com.android.application' not found.
    是什么原因?
    感谢。
  • d8133a8e9164:你的两个方法我都无法实现 用的魅蓝NOT4.4 和坚果5.0 第一个方法4.4可以设置颜色但是坚果5.0设置<item name="android:windowTranslucentStatus">false</item> 得改为true才能改变颜色 但是<item name="android:statusBarColor">@android:color/transparent</item>没有效果一直有一条透明灰色部分... 第二个方法类似
    starryZzz:@d8133a8e9164 我也是把false改为true才实现效果的。。不知道为什么
    皮球二二:@d8133a8e9164 fitSystembar的原因,一定要开启透明为true,否则需要在theme设置状态栏的颜色
    ec95b5891948:@d8133a8e9164 请问是直接运行了我工程的代码吗?
  • 64a01de1b971:请教下笔者,GIF是怎么制作的,质量很高。 :smile:
  • oaosj:如果加上抽屉,在android-19上 ,抽屉依旧顶不上系统状态栏0 0想做成网易云音乐那种效果。知乎上说用XXXXX插件可以解决,然而不想用,继续寻求解决方案。~
    oaosj:@D_clock 23333可以了。很简单,刚试出来。style设置 <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>这两个属性,然后activity的布局不要设置android:fitsSystemWindows="true"。抽屉就顶上去了。这样配合你原文章的思路。在4.4及以上的系统都解决了。nice~
    ec95b5891948:@oaosj :stuck_out_tongue_closed_eyes: 最近刚好在做这个,文章写了一些还没发布,可以先给你个思路,就是用 Android 自己提供的 ScrimInsetsFrameLayout + DrawerLayout实现,要问详细细节的话,就要等我周末更新文章到简书了哈!
  • a6e8478cc35f:请教下 第二种方式 是不是只有运行在5.0+的机器上才有效果,我看了4.4+没有效果呢
    a6e8478cc35f:@D_clock 感谢 4.4x也是可以的,我有个属性值设置错了 受教了
    ec95b5891948:@杨尚伟67 第二种方式在4.4.x的平台也有效果,可以运行一下我提供的源代码!
  • 3601522abbe8:不错哦,楼主,最近正在弄toolbar的东西,看了很有收获
  • KennethYo:感谢楼主分享,期待 toolbar 与 Design 包下控件的配合。
    DamonZh:@KennethYo https://github.com/Damonzh/NewWidgetDemo 可以看下这个 design下新控件的综合使用
    ec95b5891948:@KennethYo :grin: 最近边在开发中,敬请期待哈!
  • myserendipit:不应该是parent="Theme.AppCompat.Light.DarkActionBar"吧,这样会有黑色的ActionBar,应该是parent="Theme.AppCompat.Light.NoActionBar"才对,真阳才没有ActionBar
    ec95b5891948:@停了一下 在代码中设置取消了actionBar,详见代码哈
  • cf2684cf16b1:我的问题是fitsSystemWindows属性在4.4的系统上无效,Activity和Fragment的根布局都加了,但是无效,Toolbar和系统状态栏还是重叠的。换了手机,换了应用都不行。楼主有遇到过这种情况么?
    ec95b5891948:@一树1916 :grin: 你好,我这边开发过程中没有遇到此问题。
  • pobi:其实还有挺多坑~
    ec95b5891948:@pobi 嗯,开发过程中并没有这样的问题,如果代码正确还出现这些问题的话,不排除可能是某些定制系统的问题。
    pobi:@D_clock 与软键盘交互有点问题,输入框并不会往上移
    ec95b5891948:@pobi :grin: 愿闻其详!
  • ef3b7467fa60:关于每个布局都需要设置android:fitsSystemWindows="true"的问题,有个小小建议,可以通过抽象Activity的基类BaseActivity来处理。具体在BaseActivity的OnCreate方法的setContentView()方法后添加
    ViewGroup contentLayout = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);
    if (contentLayout.getChildAt(0) != null) {
    contentLayout.getChildAt(0).setFitsSystemWindows(true);
    }
    ec95b5891948:@coder_sharp 赞(/≧▽≦/),我待会试试!
  • 9f4561cb4b33:试了一下,做不了 "全透明状态栏+不透明导航栏"
    ec95b5891948:@9f4561cb4b33 嗯,我看到你提供的效果图是使用了模拟器,所以才有底下的那条导航栏,一般情况下,大部分真机上都不会有下面这条导航栏的,当然有些机子还是有的,如华为的系统,还有魅族的SmartBar。目前来说,个人觉得并没有很好的统一解决这一问题的方法,但是向前面提到的华为和魅族的系统都会提供让用户手动隐藏底部导航栏的入口。不知道我的回答有没有帮到你呢!
    9f4561cb4b33:坑,回复里贴不了图片呀, 效果图如http://pan.baidu.com/s/1eRyUsFo ,配置为:
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    ,问题是如何把底部导航栏的半透明效果去掉,但同时能保留顶部状态栏的效果, 谢谢?
    ec95b5891948: @9f4561cb4b33 不大懂你的意思????
  • xingstarx:写的挺好的。之前也是碰到toolbar和fitSystem的坑
  • 逍遥wqy:Android 4.4上的statusBar是白到黑的渐变色效果,看起来很丑呀
    ec95b5891948:@逍遥wqy 嗯,这是系统所决定的,但相对于之前来说,也是很大的改进了
  • totato:没写清楚api19和21以上的区别,实际上4.4和5.0及以上的实现结果是有区别的。
    28e1e4cc77b2:@D_clock爱吃葱花 楼主你好,不仅仅上面会有渐变的黑色,如果手机按键是虚拟按键,就像简书附带的图片效果,下面的按键背景也是渐变的黑色,并不是图片效果那样的纯色,请问这个怎么解决?
    ec95b5891948:@bca03f030229 你说的区别是指,4.4上面还会有渐变的黑色过度那个?
  • 049752ce4854:赞,感谢分享。
    没细看代码实现,请问和SystemBarTint实现方式一样吗?
    ec95b5891948:@tianshaojie SystemBarTint的实现我也没仔细看过,所以不能确定,不好意思 :joy:
  • AndroidKy:设置了<item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
    这三个值之后好像状态栏的颜色就改不了了。第一种方式就无效了
    forevan:有什么解决的办法吗?
    ec95b5891948:@kyson 是的,这回引起颜色设置的冲突。导致失效!
  • 10226f612535:我去试试
  • Passon_Fang:好东西
  • 程序猿联盟:围观好文
  • 阿木秀华:感谢分享!
    之前的App中也用了Translucent System Bar。遇到两个坑:
    1. fitSystemWindow的问题,不光Activity要设置,包含的Fragment的布局也需要设置fitSystemWindow=true。
    2. 4.4上是渐变色的Statusbar,5.0上是完全透明,6.0上又是半透明。下次试试你提到的android:statusBarColor。

    还有目前没有解的一个问题,Statusbar上的文字颜色。目前没有找到方法能改。系统默认白色时如果图片又是白色体验就不好。

    所以最后还是放弃使用Translucent System Bar了。

    下个App一定要再尝试一下。

    再次感谢分享。

    ec95b5891948:@谭冉冉 :grin: MIUI和Flyme上面有的API么?一般来说,不太建议单独为第三方定制的系统做这样的事情! :grin:
    谭冉冉:@D_clock 小米 魅族 可以改文字颜色
    ec95b5891948:@阿木秀华 :blush: 分享技术,共同进步!我也想改statusBar上文字颜色,但是找了诸多资料都表示无法更改颜色!
  • SHUTUP:systembartint
    ec95b5891948:@SHUTUP :blush: 之前在Github上有看过这个项目,但是因为觉得麻烦,就没有深入去琢磨
  • SHUTUP:不错,还有一种是使用toolbar的。
    ec95b5891948:@SHUTUP :+1: 嗯嗯,Toolbar我也在研究使用中,接下来也会写总结,还需要观察会不会有什么坑在里面 :stuck_out_tongue_closed_eyes:
  • lovexiaov:赞一个
    ec95b5891948:@lovexiaov :smile: 马大哈,忘了附上代码的地址,需要请看。https://github.com/D-clock/AndroidSystemUiTraining
  • devYOUK:谢谢分享
    ec95b5891948:@devYOUK :smile: 马大哈,忘了附上代码的地址,需要请看。https://github.com/D-clock/AndroidSystemUiTraining

本文标题:Android开发:Translucent System Bar

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