2011-05-24 22 views
47

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.¿Cómo configuro programáticamente el degradado de color de fondo en una barra de título personalizada?

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

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 se puede ver, el fondo de la disposición lineal se define por este chico :

<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 dinámicamente esos colores degradados en mi código No quiero codificarlos en mi archivo XML como lo hacen actualmente.

Estoy abierto a todas las ideas, si usted tiene una mejor forma de establecer un gradiente de fondo.

gracias de antemano !!

Respuesta

128

Para hacer esto en el código, se crea un GradientDrawable.
La única posibilidad de ajustar el ángulo y el color es en el constructor. Si desea cambiar el color o ángulo, basta con crear una nueva GradientDrawable y establecerla 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, he añadido un id a su LinearLayout principal de la siguiente

<?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 utilizar esto como una barra de título personalizado

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

Gracias por la punta. ¿Se puede hacer esto para un widget? Tengo un widget que tiene una forma de degradado y quiero cambiar el color de este degradado. ¿Es esto posible en el caso de los widgets? – Majjoodi

+0

impresionante !!! ... gracias ..es realmente funciona de forma dinámica ... –

+2

@slund ¿hay alguna manera de originar el gradiente del centro? en lugar de usar 'GradientDrawable.Orientation.TOP_BOTTOM?' –

Cuestiones relacionadas