更改Android应用的状态栏颜色,但保持半透明

时间:2015-07-13 11:16:08

标签: android android-5.0-lollipop android-design-library androiddesignsupport

对于我正在构建的应用,我使用了Design Support Library。 我创建了一个使用TabLayout的应用。该应用的一个小功能是,当用户更改标签时,TabLayoutToolbar的颜色都会更改为相应的颜色。我们还使用新的NavigationView向用户展示了材料设计DrawerLayout

但是,更改TabLayoutToolbar的颜色完全没问题,我们按以下方式进行操作;

String hexColor = String.format("#%06X", (0xFFFFFF & getResources().getColor(R.color.primaryColor)));
getBaseActivity().getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor(hexColor)));
mTabLayout.setBackgroundColor(getResources().getColor(primaryColor));

这一切都很好,而且应该像它一样工作。当我尝试设置Status bar背景时出现问题。由于材料设计规范告诉我们NavigationDrawer应该得到一些特殊处理,下图显示了状态栏实际上是一种半透明的形式。导航抽屉落在我的主要片段上,而导航栏位于两者之上,是一个半透明的栏。

What it should look like

我的第一个想法是,它只是一个带有#7000十六进制值的酒吧,但我无法远离事实。这样做并不会改变它应该的实际颜色的颜色"变暗"。

之后我尝试将所需颜色的较暗版本设置为状态栏的背景,如此;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getBaseActivity().getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(getResources().getColor(R.color.primaryColor));
}

但这样做之后,完整的功能就会中断。我的观点将如下所示:

enter image description here

从本质上讲,我该怎么做才能解决这个问题?我真的想改变它,以便半透明功能仍然根据材料设计规范执行它需要做的事情,但也改变status bar的背景颜色。

2 个答案:

答案 0 :(得分:0)

我认为它背后总是有一个半透明的阴影,你不能删除它。因此,您可以尝试使用颜色alpha通道来实现可接受的结果,或者考虑像这样的变通方案解决方案: 据我所知,你只想在导航抽屉打开时状态栏的颜色略有不同,对吧?那么为什么不在NavigationDrawer布局中添加一个空的View,其中包含所需的颜色和与状态栏相同的高度,以达到相同的效果?

顺便说一下,有R.dimen.status_bar_height高度规格。

答案 1 :(得分:0)

活动布局

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<include layout="@layout/drawerlayout_main" />

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:menu="@menu/drawer_menu" />

</android.support.v4.widget.DrawerLayout>

激活主题,将statusBarColor设置为透明

<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>

NavigationView扩展了ScrimInsetsFrameLayout,它会在状态栏位置绘制一些颜色

enter image description here