动态改变状态栏颜色而不失去透明度
Dynamically change status bar color without losing transparency
我知道我可以使用 colorPrimary
来确定 Toolbar
的颜色,并使用 colorPrimaryDark
来确定状态栏的颜色。
我正在使用以下主题
<!-- Base application theme. -->
<style name="Theme.Noteplus.Base.Brown" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimaryLight</item>
<item name="colorPrimaryDark">#ff0000</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
其中一个有趣的属性是,当我滑出导航菜单时,状态栏自动变为透明。
在运行-时间里,有时我想改变状态栏的颜色。
setTitle("Recycler bin");
toolbar.setBackgroundColor(Color.BLUE);
getWindow().setStatusBarColor(Color.parseColor("#5694FF"));
它将如下所示
不幸的是,调用setStatusBarColor
,当我们滑出导航菜单时,也会丢失状态栏的透明属性。
请问如何在运行时间内改变状态栏的颜色,同时不丢失其透明度属性?就我而言,在 运行 期间将状态栏更改为蓝色后,当我滑出导航抽屉时,我希望看到状态栏透明度属性被保留。
更新
我试过了
private void setStatusBarColor(int color) {
if (Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(color);
}
}
导航抽屉滑出时提供透明度属性没有帮助。
我想您的透明度问题与您使用的方法无关,而是与颜色本身有关!
您正在使用这个 getWindow().setStatusBarColor(Color.parseColor("#5694FF"));
尝试使用 RGBA 而不是 RGB,使其透明,应该是这样的:
getWindow().setStatusBarColor(Color.parseColor("#5694FF80"));
private void changeStatusBarColor(String color){
if (Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.parseColor(color));
}
}
如果你在stack overflow everyone中选中这里,在那行代码之前将状态栏的透明度设置为纯色
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
您正在使用 DrawerLayout
。这意味着,而不是使用 Window#setStatusBarColor(int)
you should be using one of DrawerLayout#setStatusBarBackground()
重载。
你的代码的等价物如下:
ColorDrawable colorDrawable = new ColorDrawable(0xFF5694FF);
drawerLayout.setStatusBarBackground(colorDrawable);
我对可以使用 Android Studio 向导创建的模板应用进行了细微更改:
我知道我可以使用 colorPrimary
来确定 Toolbar
的颜色,并使用 colorPrimaryDark
来确定状态栏的颜色。
我正在使用以下主题
<!-- Base application theme. -->
<style name="Theme.Noteplus.Base.Brown" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimaryLight</item>
<item name="colorPrimaryDark">#ff0000</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
其中一个有趣的属性是,当我滑出导航菜单时,状态栏自动变为透明。
在运行-时间里,有时我想改变状态栏的颜色。
setTitle("Recycler bin");
toolbar.setBackgroundColor(Color.BLUE);
getWindow().setStatusBarColor(Color.parseColor("#5694FF"));
它将如下所示
不幸的是,调用setStatusBarColor
,当我们滑出导航菜单时,也会丢失状态栏的透明属性。
请问如何在运行时间内改变状态栏的颜色,同时不丢失其透明度属性?就我而言,在 运行 期间将状态栏更改为蓝色后,当我滑出导航抽屉时,我希望看到状态栏透明度属性被保留。
更新
我试过了
private void setStatusBarColor(int color) {
if (Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(color);
}
}
导航抽屉滑出时提供透明度属性没有帮助。
我想您的透明度问题与您使用的方法无关,而是与颜色本身有关!
您正在使用这个 getWindow().setStatusBarColor(Color.parseColor("#5694FF"));
尝试使用 RGBA 而不是 RGB,使其透明,应该是这样的:
getWindow().setStatusBarColor(Color.parseColor("#5694FF80"));
private void changeStatusBarColor(String color){
if (Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.parseColor(color));
}
}
如果你在stack overflow everyone中选中这里,在那行代码之前将状态栏的透明度设置为纯色
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
您正在使用 DrawerLayout
。这意味着,而不是使用 Window#setStatusBarColor(int)
you should be using one of DrawerLayout#setStatusBarBackground()
重载。
你的代码的等价物如下:
ColorDrawable colorDrawable = new ColorDrawable(0xFF5694FF);
drawerLayout.setStatusBarBackground(colorDrawable);
我对可以使用 Android Studio 向导创建的模板应用进行了细微更改: