Estou tentando usar drawables vetoriais em meu aplicativo Android. De http://developer.android.com/training/material/drawables.html (ênfase minha):
No Android 5.0 (API de nível 21) e superior, você pode definir drawables vetoriais, que são escalonados sem perder a definição.
Usando este drawable:
<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" />
e este ImageView:
<ImageView
android:layout_width="400dp"
android:layout_height="400dp"
android:src="@drawable/icon_bell"/>
produz esta imagem borrada ao tentar exibir o ícone em 400 dp (em um dispositivo móvel grande de alta resolução por volta de 2015 executando pirulito):
Alterar a largura e a altura na definição do drawable vetorial para 200 dp melhora significativamente a situação no tamanho renderizado de 400 dp. No entanto, definir isso como um drawable para um elemento TextView (ou seja, o ícone à esquerda do texto) agora cria um ícone enorme.
Minhas perguntas:
1) Por que há uma especificação de largura / altura no drawable vetorial? Eu pensei que o ponto principal disso é que eles aumentam e diminuem sem perdas, tornando largura e altura sem sentido em sua definição.
2) É possível usar um único drawable vetorial que funciona como um drawable de 24 dp em um TextView, mas é bem dimensionado para usar imagens muito maiores também? Por exemplo, como evito criar vários drawables vetoriais de tamanhos diferentes e, em vez disso, uso um que se adapte aos meus requisitos de renderização?
3) Como uso efetivamente os atributos de largura / altura e qual é a diferença com viewportWidth / Height?
Detalhes adicionais:
- O dispositivo está executando API 22
- Usando o Android Studio v1.5.1 com Gradle versão 1.5.0
- O manifesto é compilado e tem como meta o nível 23, o nível mínimo 15. Também tentei mover o nível mínimo para 21, mas não fez diferença.
- Descompilar o APK (com nível mínimo definido como 21) mostra um único recurso XML na pasta drawable. Nenhuma imagem rasterizada é produzida.
drawable
pasta. A largura / altura no arquivo xml drawable vetorial é de 24 dp. Especificar um ImageView de 400 dp de altura / largura é definitivamente criar uma imagem com escala insuficiente.
drawable-anydpi-v21
é porque meu minSdkVersion
é menor que 21. Alguma mudança no comportamento se você definir o minSdkVersion
para menos de 21? Que tal mover o XML para drawable-anydpi
? Eu não esperaria que houvesse uma mudança, mas também esperaria que sua imagem vetorial fosse dimensionada corretamente ...
drawable-anydpi-v21
com várias imagens rasterizadas no mdi / hdpi / etc. pastas. Nenhuma alteração no resultado final renderizado.
New -> Vector Asset
, o XML da imagem vetorial é descartado na minha pasta drawable. No entanto, se eu usar o apktool para descompactar o APK construído, vejo que os arquivos XML estão inseridosdrawable-anydpi-v21
e são dimensionados corretamente em dispositivos API 21+. Os arquivos raster são colocados nasdrawable-<mdpi/hdpi/etc>-v4
pastas e não são usados em dispositivos API 21+ (com base no fato de que eles são dimensionados corretamente)