2009-10-25 20 views
48

Tengo una forma con un degradado que estoy usando como divisor entre ListView elementos. He definido como sigue:Cómo agregar relleno al degradado <shape> en Android?

<?xml version="1.0" encoding="UTF-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 

<gradient 
    android:startColor="#ccd0d3" 
    android:centerColor="#b6babd" 
    android:endColor="#ccd0d3" 
    android:height="1px" 
    android:angle="0" /> 

</shape> 

quisiera añadir 6 píxeles de relleno a cada lado de la pendiente, de modo que no se extiende de borde a borde de la pantalla.

Sin embargo, no importa dónde coloque un android:left="6px" y android:right="6px", parece que no surte efecto. Puedo ponerlo en el elemento <shape>, el elemento <gradient>, o en un hijo <padding> separado de <shape>, y no cambia nada.

¿Cómo puedo agregar relleno a la izquierda y derecha de mi divisor de lista?

+0

He actualizado todas las respuestas a usar DP no PX ya que la mayoría de los desarrolladores de tiempo debe utilice dp para tener en cuenta las diferentes densidades de pantalla: http://developer.android.com/guide/practices/screens_support.html – Intrications

+2

Además de los comentarios y soluciones que dicen que no se debe usar px, use dp - Me gustaría agregar que gradiente no tiene ningún atributo de altura y es inútil en este caso. La altura debe aplicarse como un atributo de un elemento . – prodaea

+0

Posible duplicado de [El relleno no afecta a en un diseño XML] (http://stackoverflow.com/questions/1283085/padding-doesnt-affect-shape-in-an-xml-layout) – tir38

Respuesta

20

Una solución parece ser "ajustar" mi dibujo con otro dibujo que especifique el relleno adecuado.

Por ejemplo, list_divider.xml sería:

<?xml version="1.0" encoding="UTF-8"?> 
<layer-list 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item 
     android:left="6dp" 
     android:right="6dp" 
     android:drawable="@drawable/list_divider_inner" /> 

</layer-list> 

Y luego list_divider_inner.xml sería el dibujable el original:

<?xml version="1.0" encoding="UTF-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 

<gradient 
    android:startColor="#ccd0d3" 
    android:centerColor="#b6babd" 
    android:endColor="#ccd0d3" 
    android:height="1px" 
    android:angle="0" /> 

</shape> 

esta manera hay dos archivos para especificar un divisor sencilla sin embargo. No obstante, no sé si hay una forma de hacerlo con solo un archivo.

+1

px se verá * genial * un teléfono xhdpi moderno. - No use px ** nunca **. Utilice ** dp ** para gráficos y ** sp ** para tamaños de fuente en su lugar. Lea: http://developer.android.com/guide/practices/screens_support.html – Martin

+1

@Martin He actualizado la respuesta para usar dp para evitar copiar y pegar malas prácticas. – Intrications

+6

Esta pregunta se trataba de usar un divisor fino entre los elementos de la vista de lista. Para esta situación particular, específicamente quería usar un único divisor de píxeles sin importar la resolución del dispositivo, por lo que px era correcto. – emmby

131

Creo que se puede combinar de esta manera:

<?xml version="1.0" encoding="UTF-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:left="6dp" 
      android:right="6dp"> 

     <shape android:shape="rectangle"> 
      <gradient android:startColor="#ccd0d3" 
         android:centerColor="#b6babd" 
         android:endColor="#ccd0d3" 
         android:height="1px" 
         android:angle="0"/> 
     </shape> 
    </item> 
</layer-list> 
+1

Esta solución es mejor porque solo usa un archivo. –

+1

Funciona de maravilla con el más mínimo cambio: android: right = "6px" /> debe ser android: right = "6px"> – OrhanC1

+9

Por supuesto, uno no debe usar px - siempre use ** dp ** o ** sp **. – Martin

45

Otra solución mediante la inserción:

<?xml version="1.0" encoding="UTF-8"?> 
<inset xmlns:android="http://schemas.android.com/apk/res/android" 
    android:insetLeft="6dp" 
    android:insetRight="6dp" > 

    <shape 
     android:shape="rectangle"> 

    <gradient 
     android:startColor="#ccd0d3" 
     android:centerColor="#b6babd" 
     android:endColor="#ccd0d3" 
     android:height="1px" 
     android:angle="0" /> 

    </shape> 

</inset> 
+0

@ntrications: no es necesario editar, utilizo px en lugar de dp aquí porque el interlocutor quiere eso. – Wayne

+1

De esta manera, también podría tenerlo en el archivo de selector. – elimirks

Cuestiones relacionadas