Entender la <lista de capas> de Android

No entiendo cómo funcionan las listas de capas. He leído la documentación oficial con algunos ejemplos, pero no funciona para mí como se esperaba. Quiero cuatro cuadrados que deben ser rellenados con 1dp, pero nada es como se esperaba. Aquí hay una captura de pantalla escalada en un 500%:

Mis sueños
(Los colores equivocados no importan)
Como se puede ver el tamaño es completamente incorrecta y los rellenos están desaparecidos. Traté de establecer valores reales como width / height y right / left / top / buttom para estar seguro de que android obtener el punto lo que quiero.

Aquí está mi xml:

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:top="0dp" android:left="0dp" android:bottom="0dp" android:right="0dp"> <shape android:shape="rectangle"> <size android:width="9dp" android:height="9dp"/> <solid android:color="#f000"/> </shape> </item> <item android:top="1dp" android:left="1dp" android:bottom="5dp" android:right="5dp"> <shape android:shape="rectangle"> <size android:width="3dp" android:height="3dp"/> <solid android:color="#f00"/> </shape> </item> <item android:top="1dp" android:left="5dp" android:bottom="5dp" android:right="1dp"> <shape android:shape="rectangle"> <size android:width="3dp" android:height="3dp"/> <solid android:color="#0f0"/> </shape> </item> <item android:top="5dp" android:left="1dp" android:bottom="1dp" android:right="5dp"> <shape android:shape="rectangle"> <size android:width="3dp" android:height="3dp"/> <solid android:color="#0f0"/> </shape> </item> <item android:top="5dp" android:left="5dp" android:bottom="1dp" android:right="1dp"> <shape android:shape="rectangle"> <size android:width="3dp" android:height="3dp"/> <solid android:color="#f00"/> </shape> </item> </layer-list> 

Los valores de izquierda, arriba, derecha e inferior se miden desde su borde respectivo.

Así que left = 0dp, top = 0dp, bottom = 0dp & right = 50dp le dará un rectángulo que es (match_parent – 50dp) de ancho y no 50dp de ancho. Por lo tanto los valores más grandes para "derecho" le darán realmente un rectángulo más pequeño.

Lo mismo se aplicaría al otro valor, pero estos se comportarían como se esperaba en la mayoría de los casos, su justo "derecho" que podría causar confusión.

Puedes usar px lugar de dp o multiplicar todas las dimensiones por 10 .

Tengo vergüenza de admitir que no sé exactamente por qué esto está sucediendo, pero mi conjetura es que tiene algo que ver con densidades donde 1dp es un valor px flotante y el ImageView se amplía.

La respuesta del experto es bienvenida 🙂

  • Brillante degradado con dibujable androide xml
  • Escala Dibujable - ¿setImageLevel determina la escala?
  • ¿Fondo vertical-rayado en XML?
  • Dibujar complejo dibujable en api inferior a 23
  • ¿Qué debo usar para un mejor rendimiento, nueve parches o un recurso xml extraíble?
  • Esquinas redondeadas con color de borde
  • BitmapFactory.decodeResource () devuelve null para la forma definida en xml drawable
  • Selector, lista de capas y forma / mapa de bits en el mismo xml
  • Cambiar el color del borde de la forma en tiempo de ejecución
  • Reutilice las imágenes dibujables para diferentes tamaños de pantalla y densidades en Android
  • Título de la acción: Mostrar Título AND Icon
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.