从透明状态变为彩色状态栏android

时间:2014-12-23 13:32:05

标签: android android-listview android-actionbar android-5.0-lollipop

我在Lollipop& amp;我知道如何通过设置此标志FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS&设置颜色 getWindow().setStatusBarColor(color);

但我有一张图片&一个透明的ActionBar&我想在动作栏后面显示图像&当用户滚动图像下方的ListView时,状态栏应填充颜色为ActionBar

问题是显示状态栏后面的图像&之后用颜色滚动填充状态栏。我不知道如何实现这种效果。

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:0)

首先,您必须在style.xml上添加TranslucentActionBar Style

    <style name="AppTheme.TranslucentActionBar">
    <item name="android:actionBarStyle">@style/Widget.ActionBar.Transparent</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="actionBarStyle">@style/Widget.ActionBar.Transparent</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="android:windowContentOverlay">@null</item>
   <!--  <item name="windowContentOverlay">@null</item> -->
</style>

在班上添加此方法。

@TargetApi(19) 
private void setTranslucentStatus(boolean on) {
    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);
}

接下来,在setContentView()

之前在OnCreate方法中添加它
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            setTranslucentStatus(true);
        }

然后状态栏将覆盖您的活动。

添加滚动侦听器并像这样添加设置状态栏alpha方法。

getWindow().setStatusBarColor(Color.argb(alpha, 253, 152, 0));

答案 1 :(得分:0)

您需要使用以下标志来使系统栏透明并在其上绘制:

activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

如方法1中所述: Lollipop : draw behind statusBar with its color set to transparent

之后,将系统栏设置为透明应该可以解决问题(请注意,这仅适用于API 21或更高版本):

getWindow().setStatusBarColor(Color.TRANSPARENT);

然后,为了在屏幕滚动时进行更改,您需要使用滚动侦听器在系统栏的实心和透明之间切换,如下所示:

getWindow().setStatusBarColor(getPrimaryDarkkColor());

getWindow().setStatusBarColor(Color.TRANSPARENT);

考虑到听众中的滚动位置。

希望这有帮助,

答案 2 :(得分:0)

只需将此代码复制到您的 onCreate 方法中并保持编码:)

代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);


nestedScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
            @Override
            public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                if (scrollY > 50) {
                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
                    getWindow().setStatusBarColor(Color.rgb(85, 155, 247));
                } else {
                    getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                            WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
                    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
                }
            }
        });
    }