2012-01-12 7 views
13

Tengo un objetivo simple. Quiero un fondo gris claro en mi FrameLayout con una línea divisoria negra debajo (solo por debajo, no por todos lados). Hasta ahora tengo esto:Cómo hacer que la gravedad funcione en un drawable en xml

<?xml version="1.0" encoding="utf-8"?> 
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
    <shape android:shape="rectangle" android:gravity="center"> 
     <solid android:color="#EEEEEE" /> 
    </shape> 
    </item> 
    <item> 
    <shape android:shape="line" android:gravity="bottom" > 
     <stroke android:width="1dip" android:color="#010101"/> 
    </shape> 
    </item> 
    </layer-list> 

Pero traza la línea a través de la central, es decir, = ignora la gravedad poco 'inferior'. ¿Cómo puedo arreglar esto?

EDITAR: Esta pregunta es muy anterior. La respuesta seleccionada puede o no estar en línea con las API actuales, etc. Se le recomienda iniciar su propia pregunta en lugar de agregarla a esta, que ya no se supervisa.

Respuesta

5

Me gustaría recomendar una imagen de nueve parche utilizando para ello - aquí hay un ejemplo que debe hacer el trabajo:

Example nine-patch image

(! Es sólo pequeña pero está ahí)

Si coloque esto en su carpeta dibujable y establezca el fondo de FrameLayout, luego debe obtener el resultado deseado. El contenido irá en el área gris y el píxel # 010101 se estirará horizontalmente para formar una línea en la parte inferior. Solo asegúrate de mantener la extensión .9.png para asegurarte de que se cargue como un parche de nueve.

Esperanza que ayuda a

+1

Ese es un buen punto, podría hacerlo de esa manera. De hecho, lo haré pero aún estaría interesado en saber qué hacer para que la etiqueta de gravedad funcione para esa línea, me parece una solución mucho más agradable, pero gracias por su sugerencia. –

+1

Sin mención de la etiqueta de gravedad [aquí] (http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.html).No veo ninguna manera de lograr esto usando xml puro, podrías crear ShapeDrawable en el código y establecer sus límites en función de los límites del diseño. – kingraam

17

Por desgracia no he encontrado una manera de conseguir la gravedad trabajando para dibujables, pero encontré cómo se puede lograr lo que quiere con XML puro:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:top="-2dp" 
     android:left="-2dp" 
     android:right="0dp" 
     android:bottom="1dp" 
     > 
     <shape android:shape="rectangle"> 
      <solid android:color="#EEEEEE"/> 
      <stroke android:width="1dp" android:color="#010101"/> 
     </shape> 
    </item> 
</layer-list> 

Buena suerte :)

+1

usman

22

He luchado mucho con esto también. Básicamente, para crear un borde en la parte inferior, debes pensar en una dirección opuesta a la que esperas. Empiezas con un rectángulo con el color de tu Borde. Además de eso, dibuja el color real, con un desplazamiento desde la parte inferior. utilizo este:

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

    <!-- CREATE A RECTANGLE WITH YOUR BORDER COLOR --> 
    <item> 
     <shape android:shape="rectangle" > 
      <solid android:color="#fff"/> 
     </shape> 
    </item> 

    <!-- NOW DEFINE THE NORMAL COLOR--> 
    <item android:bottom="BOTTOM_BORDER_THICKNESS E.G. 4dp"> 
     <shape android:shape="rectangle" > 
      <solid android:color="#ccc"/> 
     </shape> 
    </item> 
</layer-list> 

O, como sugirió Juan Pablo Saraceno:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
     <color android:color="YOUR_BORDER_COLOR" /> 
    </item> 
    <item android:top="YOUR_BORDER_THICKNESS"> 
     <color android:color="YOUR_BG_COLOR" /> 
    </item> 
</layer-list> 
+3

Esta es una respuesta muy buena y merece ser mejor posicionado en mi humilde opinión. Creo que es un poco vergonzoso que Android no admita la gravedad de la manera correcta y lo obligue a hacerlo. Funcionó para mí incluso usando etiquetas en lugar de rectángulo, formas, por lo que aún más simple.

+5

el único problema es que genera sobregiro, ya que está dibujando un rectángulo por completo con el color de la frontera sólo para sobregiro con el actual rectángulo. Sin gravedad real, aún gana 9 parches. –

+1

Esto no funcionará si necesita una parte superior translúcida y una parte inferior sólida. ¿Así que supongo que tendré * que * trabajar con un parche de nueve? –

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

    <item> 
     <shape android:shape="rectangle" > 
      <solid android:color="@color/Black" /> 
     </shape> 
    </item> 
    <item android:bottom="5dp"> 
     <shape android:shape="rectangle" > 
      <solid android:color="@color/White" /> 
     </shape> 
    </item> 

</layer-list> 
2

Esto funciona!

<item> 
     <bitmap 
     android:gravity="left|bottom" 
     android:src="@drawable/myDrawable" /> 
</item> 
+0

Nop no funciona con ShapeDrawable porque es dibujable, no es un mapa de bits. – nsvir

1

Bueno, es bastante vieja pregunta, pero ninguna de las respuestas parecen responder a la pregunta real (cómo hacer gravity de trabajo) así que aquí está un ejemplo de trabajo:

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

    <item> 
     <color android:color="#2196F3"/>  <!-- Background color --> 
    </item> 

    <item android:gravity="bottom"> 
     <shape> 
      <size android:height="10dp" />  <!-- I would suggest 1dp --> 
      <solid android:color="#F50057" /> <!-- Line color --> 
     </shape> 
    </item> 
</layer-list> 

Por analogía, si desea utilizar la gravedad left o right cambiar el atributo height a width

Cuestiones relacionadas