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.
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)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 meuminSdkVersion
é menor que 21. Alguma mudança no comportamento se você definir ominSdkVersion
para menos de 21? Que tal mover o XML paradrawable-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.Respostas:
Há novas informações sobre esse problema aqui:
https://code.google.com/p/android/issues/detail?id=202019
Parece que o uso
android:scaleType="fitXY"
fará com que seja dimensionado corretamente no Lollipop.De um engenheiro do Google:
fonte
Para versões do SDK inferiores a 21, onde o sistema de compilação precisa gerar imagens raster e como o tamanho padrão nos casos em que você não especifica a largura / altura.
Não acredito que isso seja possível se você também precisar direcionar SDKs menores que 21.
Documentação: (na verdade não é muito útil agora que reli ...)
Mais documentação:
Edit: Algo estranho está acontecendo. Aqui estão meus resultados no emulador SDK versão 23 (Lollipop + dispositivo de teste está morto agora ...):
E no emulador SDK versão 21:
fonte
width
height
viewport
height
ewidth
dexml
?O AppCompat 23.2 apresenta drawables vetoriais para todos os dispositivos que executam o Android 2.1 e superior. As imagens são dimensionadas corretamente, independentemente da largura / altura especificada no arquivo XML do drawable vetorial. Infelizmente, essa implementação não é usada na API de nível 21 e acima (em favor da implementação nativa).
A boa notícia é que podemos forçar o AppCompat a usar sua implementação nos níveis de API 21 e 22. A má notícia é que temos que usar reflexão para fazer isso.
Em primeiro lugar, verifique se você está usando a versão mais recente do AppCompat e se ativou a nova implementação de vetor:
Em seguida, chame
useCompatVectorIfNeeded();
onCreate () do seu aplicativo:Por fim, certifique-se de usar em
app:srcCompat
vez deandroid:src
definir a imagem de ImageView:Seus drawables vetoriais agora devem ser dimensionados corretamente!
fonte
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, bem como uma imagem grande com largura próxima à tela?
3) Como uso efetivamente os atributos de largura / altura e qual é a diferença com viewportWidth / Height?
fonte
Eu resolvo meu problema apenas alterando o tamanho da imagem vetorial. Desde o início era um recurso como:
E eu mudei para 150 dp (tamanho de ImageView no layout com este recurso de vetor) como:
Está funcionando para mim.
fonte
Eu tento muitas dessas maneiras, mas, infelizmente, nenhuma delas funcionou. Eu tento
fitXY
emImageView
, eu tente usarapp:srcCompat
mas não pode até usá-lo. mas achei um jeito complicado:Mas o ponto dessa forma são as dimensões das Visualizações. se o seu
ImageView
tiver dimensões incorretas, o drawable obtém Stretch. você deve controlá-lo nas versões pré-pirulito ou usar algumas visualizaçõesPercentRelativeLayout
.Espero que seja útil.
fonte
Primeiro : importe svg para drawble: (( https://www.learn2crack.com/2016/02/android-studio-svg.html ))
Segundo : se você deseja suporte do Android API 7 ou superior, é necessário usar a biblioteca de suporte do Android de acordo (( https://stackoverflow.com/a/44713221/1140304 ))
1- adicionar
ao seu arquivo build.gradle.
2-Use namespace em seu layout que tenha imageView:
Terceiro : defina imageView com android: scaleType = "fitXY" e use app: srcCompat
Quarto : se você deseja definir svg no código java, você deve adicionar a linha abaixo em oncreate methoed
fonte
Para mim, o motivo que fez com que os vetores fossem convertidos em png foi um
android:fillType="evenodd"
atributo no meu drawable vetorial. Quando removi todas as ocorrências desse atributo em meu drawable (portanto, ononzero
tipo de preenchimento padrão aplicado ao vetor), da próxima vez que o aplicativo foi construído estava tudo bem.fonte