状态栏 导航栏 和 action bar的样式设定

本文介绍了如何在Android中设置透明状态栏、颜色状态栏、可折叠action bar以及透明导航栏。通过设置android:windowTranslucentStatus、fitsSystemWindows属性以及在styles.xml中配置颜色,可以实现状态栏和action bar的透明效果。同时,通过代码动态调整,可以改变导航栏颜色或使其变为半透明。示例代码和详细步骤供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

透明状态栏

透明状态栏一般用在有背景图片的页面中。

这种情况我们可能希望顶部的状态栏从蓝色变为透明。

想实现这个可以设定: android:windowTranslucentStatus 这个属性

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

不过这个属性是从 SDK V21 才加上的,所以我们需要建一个values-v21文件夹,在这个文件夹中定义一个 styles.xml 加上刚才提到的属性。 比如这样:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowTranslucentStatus">true</item>
    </style>
</resources>

这样实现的效果为: 

在顶端状态栏的部分,你会发现蓝色的占了一部分,半透明的占了一部分。 这是因为,在layout的xml文件中ImageView这个控件默认是放到了status bar的下面,因此他不会占用status bar的区域,这样就导致了 status bar 的颜色还是蓝色(colorPrimaryDark定义),而网上滚动了一段距离之后,蓝色的占了一部分、背景图片占了一部分高度。

想完全去掉蓝色部分,让ImageView完全占有status bar的高度,可以给ImageView添加下面的一个属性fitsSystemWindows=true:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerCrop"
    app:layout_collapseMode="parallax"
    android:fitsSystemWindows="false" <!-- 重点在这个属性 -->
    android:src="@drawable/x2" />

这样运行就可以看到这样的效果: 

会看到已经没有蓝色的状态栏了,ImageView 已经完全使用了status bar的空间。 向上滑动,折叠之后你会看到折叠之后带action bar的效果: 

你可能会问:

  1. ImageView现在位于status bar半透明栏的下面,能不能让status bar全透明?
  2. 折叠之后,能不能保留ImageView作为背景?

第一点这样来做, 在Activity的onCreate方法中加上这段代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Start here
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.TRANSPARENT);
    }
    // End here
    ...
}

运行效果如下: 

第二点这样来做,在v21/styles.xml里面加上colorPrimary / colorPrimaryDark 的透明色设定:

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="colorPrimary">@android:color/transparent</item>
    <item name="colorPrimaryDark">@android:color/transparent</item>
	</style>
</resources>

你可能会说:我已经定义过这两个颜色了啊。 是的,在values/styles.xml里面, 通常情况下我们已经定义过这两个颜色色值了,否则我们也不会看到上面截图中的蓝色。当我们将这两个颜色设定为 transparent 之后,status bar (对应的是 colorPrimratyDark) 和 action bar(对应的是 colorPrimrary)就都是透明的了,所以在折叠之后显示status bar 和 action bar的时候 就可以看到ImageView的图片了。 运行效果如下: 

颜色状态栏

如果背景不是图片而是颜色填充则更加适合。 这个你应该已经想到了,改变 colorPrimrary / colorPrimraryDark.

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="colorPrimary">@android:color/holo_orange_light</item>
    <item name="colorPrimaryDark">@android:color/holo_orange_dark</item>
	</style>
</resources>

然后运行是这个效果: 

你可能会问,怎么 status bar 和 action bar 的颜色是一样的? 这是一个好问题,我们明明设定了status bar的颜色为更深的颜色,现在运行起来怎么是一样的呢?原因是因为我们在刚才的 Activity#onCreate 里面加了这段代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Start here
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.TRANSPARENT);
    }
    // End here
    ...
}

这段代码导致了status bar为全透明,所以status bar的颜色跟 action bar的颜色一样了。

我们注释掉这段代码再来一次。效果是这样的: 

我知道你又要说status bar的颜色跟设定的颜色还是不一样,看起来像是半透明的感觉。 你说的对,这是因为在 v21/styles.xml 里面我们设定了 <item name="android:windowTranslucentStatus">true</item> 去掉他,再运行一次,结果就如我们期望的那样了: 

可折叠action bar

上述的效果中,默认是action bar是不显示的,或者说不是以非常明显的方式来显示,而是一个展开的样式,在向上滑动之后折叠成了action bar,这是CoordinatorLayout实现,待仔细研究。

透明导航栏 & 导航栏颜色

上面的这些截图当中,底部的导航栏都是黑色背景,而我们在某种阅读场景下可能会想知道如何把导航栏也设定为透明的,用下面的代码可以设定为半透明样式, 还是在 v21/styles.xml,加上这段代码:

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

就可以实现这样的效果: 

类似的,如果我们想要改变导航栏的颜色,这样来设定:

<!-- 设定颜色时不能为透明, 所以设定为false -->
<item name="android:windowTranslucentNavigation">false</item> 
<item name="android:navigationBarColor">@color/colorAccent</item>

注: colorAccent 是在colors.xml里面定义的:

<color name="colorAccent">#FF4081</color>

运行效果如下: 


代码下载 (https://github.com/chinalwb/AE/tree/master/summaryOfMine/statusbar_navigationbar_actionbar


水平有限,如有不正确的地方,请您指出,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值