Estoy intentando usar elementos de diseño vectoriales en mi aplicación de Android. De http://developer.android.com/training/material/drawables.html (énfasis mío):
En Android 5.0 (API nivel 21) y superior, puede definir elementos de diseño vectoriales, que escalan sin perder definición.
Usando este dibujable:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" />
y este ImageView:
<ImageView
android:layout_width="400dp"
android:layout_height="400dp"
android:src="@drawable/icon_bell"/>
produce esta imagen borrosa cuando se intenta mostrar el icono a 400 dp (en un dispositivo móvil de alta resolución de alrededor de 2015 que ejecuta una paleta):
Cambiar el ancho y el alto en la definición del vector dibujable a 200dp mejora significativamente la situación en el tamaño renderizado de 400dp. Sin embargo, configurar esto como un elemento de dibujo para un elemento TextView (es decir, el icono a la izquierda del texto) ahora crea un icono enorme.
Mis preguntas:
1) ¿Por qué hay una especificación de ancho / alto en el vector dibujable? Pensé que el objetivo de estos es que se escalan hacia arriba y hacia abajo sin pérdidas, lo que hace que el ancho y la altura no tengan sentido en su definición.
2) ¿Es posible usar un único elemento de dibujo vectorial que funcione como elemento de dibujo de 24 dp en un TextView pero que se amplíe bien para usar imágenes mucho más grandes también? Por ejemplo, ¿cómo evito crear varios elementos de diseño vectoriales de diferentes tamaños y, en su lugar, uso uno que se adapte a mis requisitos renderizados?
3) ¿Cómo utilizo eficazmente los atributos de ancho / alto y cuál es la diferencia con viewportWidth / Height?
Detalles adicionales:
- El dispositivo está ejecutando API 22
- Usando Android Studio v1.5.1 con Gradle versión 1.5.0
- Manifest es compilar y nivel objetivo 23, nivel mínimo 15. También intenté mover el nivel mínimo a 21, pero esto no hizo ninguna diferencia.
- La descompilación del APK (con el nivel mínimo establecido en 21) muestra un solo recurso XML en la carpeta dibujable. No se producen imágenes rasterizadas.
drawable
carpeta. El ancho / alto en el archivo xml dibujable de vectores es 24 dp. Especificar un ImageView de 400dp de alto / ancho definitivamente está creando una imagen mal escalada.
drawable-anydpi-v21
es porque my minSdkVersion
es menor que 21. ¿Algún cambio en el comportamiento si lo pones minSdkVersion
en menos de 21? ¿Qué hay de mover el XML a drawable-anydpi
? No esperaría que hubiera un cambio, pero también esperaría que su imagen vectorial se escale correctamente ...
drawable-anydpi-v21
con varias imágenes rasterizadas en mdi / hdpi / etc. carpetas. Sin embargo, no hay cambios en el resultado final renderizado.
New -> Vector Asset
, suelta la imagen vectorial XML en mi carpeta dibujable. Sin embargo, si utilizo apktool para descomprimir el APK que se compila, veo que los archivos XML están instaladosdrawable-anydpi-v21
y escalan correctamente en dispositivos API 21+. Los archivos ráster se colocan en lasdrawable-<mdpi/hdpi/etc>-v4
carpetas y no se usan en dispositivos API 21+ (basado en el hecho de que escalan correctamente)