¿Cómo configuro mediante programación el degradado de color de fondo en una barra de título personalizada?

82

Hay muchos tutoriales y preguntas sobre SO que implementan barras de título personalizadas. Sin embargo, en mi barra de título personalizada tengo un degradado personalizado para el fondo y me gustaría saber cómo configurarlo dinámicamente en mi código.

Aquí es donde se llama mi barra de título personalizada:

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

Y este es mi 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>

Como puede ver, el fondo del diseño lineal lo define este tipo:

<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>

Lo que me gustaría hacer es establecer esos colores degradados dinámicamente en mi código. No quiero codificarlos en mi archivo XML como lo están actualmente.

Estoy abierto a todas las ideas si tiene una mejor manera de establecer un degradado de fondo.

¡¡Gracias de antemano!!

AngeloS
fuente

Respuestas:

207

Para hacer esto en código, crea un GradientDrawable.
La única posibilidad de establecer el ángulo y el color está en el constructor. Si desea cambiar el color o el ángulo, simplemente cree un nuevo GradientDrawable y configúrelo como fondo

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

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

    layout.setBackgroundDrawable(gd);

Para que esto funcione, agregué una identificación a su LinearLayout principal de la siguiente manera

<?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>

Y para usar esto como una barra de título personalizada

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title_bar);
    View title = getWindow().findViewById(R.id.mainlayout);
    title.setBackgroundDrawable(gd);
deslizarse
fuente
Gracias por el consejo. ¿Se puede hacer esto para un widget? Tengo un widget que tiene forma de degradado y quiero cambiar el color de este degradado. ¿Es esto posible en el caso de los widgets?
Majjoodi
2
@slund ¿hay alguna forma de originar el degradado desde el centro? en lugar de usar 'GradientDrawable.Orientation.TOP_BOTTOM?'
Louis Evans
Está bien, pero ¿qué hacer si la API del usuario es <16?
marca el
@mark, esta es la respuesta para su pregunta stackoverflow.com/a/11947755/3080016
HinoHara
6
setBackgroundDrawable()está en desuso desde, creo, API 16. Debería usar setBackground()también / en su lugar. Ver stackoverflow.com/questions/27141279/…
ban-geoengineering
1

Si la respuesta aceptada no funciona, puede intentar configurarla foreground.

color.setForeground(gradient);
Jakub Piga
fuente