如何在不影响导航栏的情况下将状态栏的背景更改为渐变

时间:2018-01-29 11:11:04

标签: android android-layout android-windowmanager android-statusbar

我试图让状态栏显示与其下方背景完全相同的渐变,就像在这个问题中一样:How to apply gradient to status bar in android?

然而,该问题的答案导致整个布局延伸到导航栏,这是我想要避免的。

我无法找到一种不使用WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS的方式,并且状态栏要么完全透明,要么让它显示渐变(与下面的渐变相同。 / p>

有没有办法让状态栏显示渐变,而不影响导航栏?理想情况下,状态栏是"隐藏",其中电源/ wifi / etc图标仍然可见,但看到的颜色是当前活动的布局的渐变。

3 个答案:

答案 0 :(得分:1)

实现目标的一种方法。

将窗口背景设置为渐变,状态栏颜色为透明。

以下是示例代码。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     Window window = getWindow();
     Drawable background = getResources().getDrawable(R.drawable.bg_gradient); //bg_gradient is your gradient.
     window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
     window.setStatusBarColor(getResources().getColor(android.R.color.transparent));
     window.setBackgroundDrawable(background);
}

答案 1 :(得分:1)

对于此类任务。您必须在活动或片段中将第一个FLAG_LAYOUT_NO_LIMITS标记设置为

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }

现在,在您的XML中,只需在布局顶部设置view,例如

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <View
        android:id="@+id/status_bar_view"
        android:background="#000"       
        android:layout_width="match_parent"
        android:layout_height="24dp"/>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="22dp">
                 //main layout here.
    </RelativeLayout>        
</LinearLayout>

因此,顶视图取代了布局中的状态栏,您可以根据需要设置视图背景。在上面的view中,我只使用了黑色,你也可以将渐变设置为背景。

编辑

但我们还必须动态设置view,因为根据屏幕尺寸,每个设备上状态栏的高度不同。因此,您计算的状态栏高度为

public int getStatusBarHeight() {
        int result = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    } 

上述方法返回每个设备的状态栏高度。您可以将其设置为view的高度。因此,您的视图看起来与状态栏的大小完全相同。

答案 2 :(得分:0)

func setGradientStatusBar(){

    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = CGRect(x:0, y:-20, width:375, height:64)
    let colorTop = UIColor(red: 85/255, green: 66/255, blue: 35/255, alpha: 1.0).cgColor
    let colorBottom = UIColor(red: 169/255, green: 132/255, blue: 69/255, alpha: 1.0).cgColor
    gradientLayer.colors = [ colorTop, colorBottom]
    gradientLayer.locations = [ 0.0, 1.0]
    gradientLayer.frame = CGRect(x:0, y:0, width:UIScreen.main.bounds.width, height:UIApplication.shared.statusBarFrame.height)
    let window: UIWindow? = UIApplication.shared.keyWindow
    let view = UIView()
    view.backgroundColor = UIColor.clear
    view.translatesAutoresizingMaskIntoConstraints = false
    view.frame = CGRect(x: 0, y: 0, width: (window?.frame.width)!, height: self.view.frame.height * 0.07)
    view.layer.addSublayer(gradientLayer)
    window?.addSubview(view)
}