2011-05-12 24 views
182

Tengo problemas para aplicar un degradado de fondo a LinearLayout.Android LinearLayout Gradient Background

Esto debería ser relativamente simple por lo que he leído, pero parece que no funciona. Como referencia, estoy desarrollando 2.1-update1.

header_bg.xml:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <gradient 
     android:angle="90" 
     android:startColor="#FFFF0000" 
     android:endColor="#FF00FF00" 
     android:type="linear"/> 
</shape> 

main_header.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="50dip" 
    android:orientation="horizontal" 
    android:background="@drawable/header_bg"> 
</LinearLayout> 

Si cambio @ estirable/header_bg a un color - por ejemplo, # FF0000 funciona perfectamente bien. ¿Me estoy perdiendo algo obvio aquí?

+0

androide: backgroundTint androide: backgroundTintMode http://stackoverflow.com/a/43341289/3209132 –

Respuesta

329

Ok Pude resolver esto usando un selector. Ver código de abajo:

main_header.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="50dip" 
    android:orientation="horizontal" 
    android:background="@drawable/main_header_selector"> 
</LinearLayout> 

main_header_selector.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item> 
    <shape> 
     <gradient 
      android:angle="90" 
      android:startColor="#FFFF0000" 
      android:endColor="#FF00FF00" 
      android:type="linear" /> 
    </shape> 
</item> 
</selector> 

Esperemos que esto ayuda a alguien que tiene el mismo problema.

+2

Genial.FYI, vea otros tipos de degradados: http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html#attr_android:type – Bamaco

15

Intenta eliminar android: gradientRadius = "90". Aquí hay uno que funciona para mí:

<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle" 
> 
    <gradient 
     android:startColor="@color/purple" 
     android:endColor="@color/pink" 
     android:angle="270" /> 
</shape> 
+0

Desafortunadamente eso no funciona para mí. He actualizado la pregunta original con lo que tengo ahora. – Genesis

+0

¿Todavía no funciona cuando agrega un widget en el diseño (por ejemplo, un TextView? –

+0

Correcto, todavía no funciona con un TextView dentro del diseño. De nuevo, si aplico un color estático en lugar de un dibujante, funciona solo bien. Una cosa que he notado es que puedo (a veces) hacer que funcione usando un selector, pero eso no debería ser necesario desde mi comprensión. – Genesis

0

Verificaría su canal alfa en sus colores degradados. Para mí, cuando estaba probando mi código, tenía el canal alfa equivocado en los colores y no funcionó para mí. ¡Una vez que obtuve el canal alfa, todo funcionó!

5

Mi problema fue que la extensión .xml no se agregó al nombre del archivo XML recién creado. Agregar la extensión .xml solucionó mi problema.

28

También es posible tener el tercer color (centro). Y diferentes tipos de formas.

Por ejemplo, en dibujable/gradient.xml:

<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <gradient 
     android:startColor="#000000" 
     android:centerColor="#5b5b5b" 
     android:endColor="#000000" 
     android:angle="0" /> 
</shape> 

Esto le da negro - gris - negro (de izquierda a derecha) que es mi favorito atm fondo oscuro.

Recuerde agregar gradiente.xml como fondo en su diseño xml:

android:background="@drawable/gradient" 

También es posible girar, con:

ángulo = "0"

le da una línea vertical

y con

angle = " 90"

le da una línea horizontal

ángulos posibles son:

0, 90, 180, 270.

También hay unos pocos tipos diferentes de formas:

android: shape = "rectangle"

forma redondeada:

androide: forma = "ovalada"

y problably un poco más.

Espero que ayude, ¡salud!

1

No sé si esto va a ayudar a nadie, pero mi problema era que estaba tratando de establecer el gradiente de la "src" propiedad de un ImageView así:

<ImageView 
    android:id="@+id/imgToast" 
    android:layout_width="wrap_content" 
    android:layout_height="60dp" 
    android:src="@drawable/toast_bg" 
    android:adjustViewBounds="true" 
    android:scaleType="fitXY"/> 

No es 100% seguro de por qué eso no funcionó, pero ahora lo cambiaron y poner el dibujable en el "fondo" propiedad del padre del ImageView, que es un RelativeLayout en mi caso, así: (esto funcionó con éxito)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:id="@+id/custom_toast_layout_id" 
    android:layout_height="match_parent" 
    android:background="@drawable/toast_bg"> 
10

en Archivo XML Drawable:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape> 
      <gradient android:angle="90" 
       android:endColor="#9b0493" 
       android:startColor="#38068f" 
       android:type="linear" /> 
     </shape> 
    </item> 
</selector> 

En el archivo de diseño: androide: Fondo = "@ estirable/gradient_background"

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@drawable/gradient_background" 
     android:orientation="vertical" 
     android:padding="20dp"> 
     ..... 

</LinearLayout> 

enter image description here