如何以编程方式在自定义标题栏上设置背景颜色渐变?


79

有很多教程和有关实现自定义标题栏的SO问题。但是,在我的自定义标题栏中,我为背景设置了自定义渐变,我想知道如何在代码中动态设置它。

这是我的自定义标题栏的调用位置:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.foo_layout);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar); 

这是我的custom_title_bar

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@layout/custom_title_bar_background_colors">
<ImageView   
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:src="@drawable/title_bar_logo"
              android:gravity="center_horizontal"
              android:paddingTop="0dip"/>

</LinearLayout>

如您所见,线性布局的背景是由这个人定义的:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient 
    android:startColor="#616261" 
    android:endColor="#131313"
    android:angle="270"
 />
<corners android:radius="0dp" />
</shape>

我想做的是在我的代码中动态设置那些渐变颜色。我不想像现在一样在我的XML文件中对其进行硬编码。

如果您有更好的设置背景渐变的方法,我欢迎所有想法。

先感谢您!!

Answers:


200

为此,您需要创建一个GradientDrawable。
设置角度和颜色的唯一机会是在构造函数中。如果要更改颜色或角度,只需创建一个新的GradientDrawable并将其设置为背景

    View layout = findViewById(R.id.mainlayout);

    GradientDrawable gd = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM,
            new int[] {0xFF616261,0xFF131313});
    gd.setCornerRadius(0f);

    layout.setBackgroundDrawable(gd);

为此,我向您的主要LinearLayout添加了一个ID,如下所示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainlayout"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<ImageView   
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:src="@drawable/title_bar_logo"
              android:gravity="center_horizontal"
              android:paddingTop="0dip"/>

</LinearLayout>

并将其用作自定义标题栏

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title_bar);
    View title = getWindow().findViewById(R.id.mainlayout);
    title.setBackgroundDrawable(gd);

谢谢你的提示。可以为小部件完成此操作吗?我有一个具有渐变形状的小部件,我想更改此渐变的颜色。如果是小部件,这可能吗?
2011年

2
@slund有什么方法可以从中心产生渐变吗?而不是使用“ GradientDrawable.Orientation.TOP_BOTTOM?”
Louis Evans

可以,但是如果用户的API <16,该怎么办?
2014年


6
setBackgroundDrawable()自从我认为API 16开始就已弃用。您也应该使用setBackground()/代替。见stackoverflow.com/questions/27141279/...
禁令,地球工程

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.