VectorDrawable - está disponível de alguma forma para versões pré-Lollipop do Android? [fechadas]


87

fundo

Percebi que o Android agora suporta algum tipo de desenho vetorial, por meio de uma classe chamada " VectorDrawable " (e também AnimatedVectorDrawable , BTW). Descobri isso examinando o que há de novo no Android-Studio .

Eu me pergunto se isso seria o fim de ter de colocar vários arquivos em várias pastas ( mdpi, hdpi, xhdpi, etc). Isso seria ótimo e pode minimizar o tamanho dos aplicativos em alguns casos.

As questões

Eu gostaria de fazer algumas perguntas sobre esta nova classe:

  1. É possível usá-lo em versões mais antigas do Android, talvez através de uma biblioteca até mesmo da biblioteca de suporte do Google?

  2. Não estou familiarizado com seu funcionamento, mas o Lollipop pode lidar com arquivos SVG? Ele pode fazer qualquer coisa que seja alcançável em arquivos SVG?

  3. Existe algum exemplo / tutorial / vídeo de como usá-lo, além da documentação que encontrei?


3
Pelo que posso ver, VectorDrawable é a androidificação de arquivos SVG. No entanto, estou usando SVG s há mais de um ano por meio do uso de bibliotecas de terceiros . ( android-svg , svg-android e outros). Existem outros com nomes semelhantes. Cada um é diferente dos outros, portanto, escolha com precisão dependendo de suas necessidades.
Phantômaxx

7
Fiz uma ferramenta online para converter SVG em vetor de recursos xml (apenas pirulito) - inloop.github.io/svg2android - não foi muito testado ainda no início do alfa. Ele suporta arquivos svg simples (como o Android suporta), eu testei com o inkscape - desenhei algumas formas (ret, círculo, espiral ...), selecione tudo e "Caminho-> Objeto para caminho", exportado para * .svg e caiu no site, gerou xml e funciona bem.
Yuraj

1
@Yuraj Uau, é tão legal! Ótimo trabalho ! E em tão pouco tempo ... Aqui, pegue meu +1. :)
desenvolvedor Android

Em relação a inloop.github.io/svg2android ... Obtives a very usefull tool but I resultado impróprio nesse caso e não sei o que há de errado ... Hmmm, para futuros lançamentos gostaria que esta ferramenta notasse sobre formato incorreto ... Se eu usei arquivos svg puros com libs de terceiros, está tudo bem ...
Alex Zezekalo

@AlexZezekalo Você deve escrever sobre isso em sua página do Github: github.com/inloop/svg2android
android developer

Respostas:


39

ATUALIZAÇÃO EM março de 2016

Por atualização da Biblioteca de Suporte do Android 23.2.1 , Desenhos de vetor de suporte e Drawables de vetor animado. (você também pode usar o último para o mesmo)

Atualize a versão de uma biblioteca no arquivo gradle.

compile 'com.android.support:recyclerview-v7:23.2.1'

Os drawables vetoriais permitem que você substitua vários recursos PNG por um único gráfico vetorial , definido em XML. Embora anteriormente limitado ao Lollipop e dispositivos superiores , ambos VectorDrawablee AnimatedVectorDrawableagora estão disponíveis por meio de duas novas bibliotecas de suporte support-vector-drawable e animated-vector-drawable. novo app:srcCompatatributo para referenciar drawables vetoriais.

Verifique a fonte no github com alguns exemplos de exemplo .

Mudanças na biblioteca appcompat v7:

Dependência revertida em ativos vetoriais para que os desenvolvedores que usam a biblioteca appcompat não sejam forçados a usar VectorDrawablee seus sinalizadores de construção associados.


3
Sobre o suporte a vetores, não é suficiente atualizar o plugin do gradle e usar "vectorDrawables.useSupportLibrary = true" dentro de "defaultConfig"?
desenvolvedor Android de

1
sim, para Gradle Plugin 2.0+ e Gradle Plugin 1.5, você precisa adicionar -> android {defaultConfig {generatedDensities = []} // Isso é tratado para você pelo plug-in Gradle 2.0+ aaptOptions {additionalParameters "--no-version -vetores "}}
Amit Vaghela

1
Além disso, mostre algum código aqui. Um link pode morrer algum dia. Você receberá +1 por este esforço :)
desenvolvedor Android

sim com certeza. postará código em curto espaço de tempo no git e aqui.
Amit Vaghela 02 de

2
A compileafirmação acima implica que o projeto usa o RecyclerViewque nem sempre é o caso.
razzledazzle,

13

Atualização 2 : eles o habilitam novamente na Biblioteca de Suporte 23.4.0:

Para usuários de AppCompat, adicionamos uma API opcional para reativar o suporte a Drawables de vetores (o comportamento encontrado em 23.2) por meio de AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) - tenha em mente que isso ainda pode causar problemas com o uso de memória e problemas ao atualizar instâncias de configuração, por isso é desabilitado por padrão.

Verifique este 23.4.0 disponível agora

Atualização : não funciona a partir da versão 23.3.0. Verifique aqui os detalhes. Drawables proxy não funcionam. app:srcCompate setImageResource()trabalho, no entanto.


O suporte a Vector Drawable está disponível na Biblioteca de Suporte da versão 23.2 e posteriores. No entanto, para usar adequadamente esses drawables, eles devem ser referenciados indiretamente.

O primeiro passo seria alterar a AppCompatversão.

compile 'com.android.support:appcompat-v7:23.2.0'

Em segundo lugar, ative o suporte Vector Drawable. Se estiver usando o plugin do Gradle, 2.0+

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
}

De outra forma

android {  
   defaultConfig {  
     generatedDensities = []  
   }  

   aaptOptions {  
     additionalParameters "--no-version-vectors"  
   }  
}

Terceiro , consulte a resposta vinculada .


sim, eu vi isso. Obrigado pela informação estendida. Presumo que, para todo o sistema (notificações, widgets, ...), isso não está disponível ...
desenvolvedor do Android,

Certo de que deve funcionar. Basicamente, faz referência a drawables daquele ponto em diante. Tentaste? O exemplo aqui define um drawable vetorial para a MenuItem, que funciona bem.
razzledazzle

Tem certeza de que funcionará até mesmo para notificações e widgets? Estou falando sobre como fazê-lo funcionar em versões antigas do Android. Como eles poderiam lidar com vetores para isso? Eles não podem usar a biblioteca de suporte, não?
desenvolvedor Android de

O objetivo de usar a versão da Biblioteca de Suporte é fazer as coisas funcionarem nas versões mais antigas. Conforme documentado, ele funciona desde a API 7 e drawables vetoriais animados da API 11.
razzledazzle

Novamente, isso funciona dentro do aplicativo, mas e se você tentar usá-los fora, como em notificações e widgets? Não acho que funcionará lá, porque não acho que você possa fazer outros aplicativos (inicializadores) usarem a biblioteca de suporte, muito menos a barra de notificação. Tentaste?
desenvolvedor Android de

12

Você pode tentar esta biblioteca de suporte . Ele suporta VectorDrawable e AnimatedVectorDrawable introduzidos no Lollipop com compatibilidade total com versões anteriores.


Essa biblioteca é compatível apenas com API de nível 14 e superior, enquanto a biblioteca Mr Vector é compatível até 7+.
donturner

@donturner: Concordo com seu ponto, mas não acho que os devs ainda estejam desenvolvendo aplicativos para 7 API.
V_J

4
Talvez não a API 7, mas definitivamente a API 10 (Gingerbread), já que representa 4,1% do mercado Android ( developer.android.com/about/dashboards/index.html ).
donturner

8

Para complementar algumas das respostas aqui: sim, você pode obter suporte para VectorDrawables pré-Lollipop , pelo menos parcial.

Quão parcial? Depende - fiz este diagrama para ajudar (válido para a Biblioteca de Suporte 23.4.0 a - pelo menos - 25.1.0).

Cheatsheet VectorDrawable


Na verdade, mas acho que se você permitir que ele gere automaticamente os arquivos png, deve ser seguro
desenvolvedor do Android

1
Explicado de maneira precisa.
Abhijit Kurane de

Esta deve ser a resposta aceita. Obrigado.
Justin Meiners

6

Infelizmente, neste momento, VectorDrawable e AnimatedVectorDrawable não estão disponíveis na biblioteca de suporte. Mas para aproveitar esse recurso nas versões Pré-Lollipop, você pode usar o backport não oficial chamado MrVector.

MrVector está disponível no Github e será compatível com as versões 7 do Android.

Do Leiame oficial

Para adicionar a dependência MrVector, adicione a seguinte linha ao seu bloco de dependências build.gradle.

compile 'com.telly:mrvector:0.2.0'

Para criar o drawable a partir do XML vetorial,

Drawable drawable = MrVector.inflate(getResources(), R.drawable.vector_android);

Espero que isto ajude.


1
MrVector foi descontinuado há poucos dias em favor do próximo VectorDrawableCompat que fará parte da biblioteca de suporte.
WindRider

Isso é muito legal. Obrigado pela informação.
gnuanu

Sim, mal posso esperar para melhorar meu aplicativo com alguns
SVGs gordos

1
Descontinuada. Em vez disso, use stackoverflow.com/a/30502261/1954675 .
V_J

3

Se você estiver usando o VectorDrawable, o Android Studio irá gerar automaticamente os arquivos PNG de acordo (com base em seus arquivos XML) para as versões Pré-Lollipop.

Observe que esses arquivos PNG gerados são considerados BitmapDrawables em vez de VectorDrawables em dispositivos que executam API abaixo de 21 e, portanto, não podem ser animados ou semelhantes nesses dispositivos.

Consulte "compatibilidade com versões anteriores" para obter mais detalhes: http://android-developers.blogspot.co.at/2015/09/android-studio-14.html


Sim, foi publicado recentemente. No entanto, ele está usando PNGs, em vez de usar os vetores, portanto, se eu alterar o tamanho do imageView que contém a imagem, ele ficará pixelado / borrado.
desenvolvedor Android de

@android developer: você está parcialmente certo. Esse comportamento ocorrerá, mas seria o mesmo para VectorDrawables. Cada VectorDrawable tem uma largura e uma altura definidas em seu XML (por exemplo, vector_drawable.xml). Se essa largura / altura for definida para 50x50dp, mas você definir o tamanho de ImageView para 100x100dp, o resultado ainda ficará borrado mesmo se você estiver executando o Android 5.0 (e, portanto, estiver usando o VectorDrawable em vez de um BitmapDrawable gerado automaticamente). O benefício real de um VectorDrawable em relação a um bitmap comum é que ele considera o dpi da tela e, portanto, não desfoca mesmo em monitores 4k.
Mehlyfication de

Você quer dizer que VectorDrawable não mostra bem ao usar um tamanho que não foi definido para ele? Mas é um conteúdo vetorizado ... Por que funcionaria de outra forma?
desenvolvedor do Android,

Ele também gera pngs para Drawables vetoriais animados?
Louis CAD

Não, não criará PNGs para esse caso. Se você deseja animar o drawable vetorial em dispositivos que executam a versão Android anterior ao Android 5.0, experimente o VectorDrawableCompat: developer.android.com/reference/android/support/graphics/…
Mehlyfication

3

O Lollipop não pode lidar com arquivos SVG sem bibliotecas de terceiros.

A melhor solução que encontrei é a biblioteca BetterVectorDrawable junto com o conversor SVG para VectorDrawable .

BetterVectorDrawable é a implementação VectorDrawable para Android 4.0+ com comportamento de fallback configurável no Android 5.0+.

SVG to VectorDrawable Converter é o conversor em lote de imagens SVG para arquivos de recursos XML do Android VectorDrawable. Versão online

Os links apontam para readmes, que fornecem informações suficientes sobre como usar a lib e o conversor.


2

Não há VectorDrawables na biblioteca de suporte neste momento.

Funkystein está certo - VectorDrawable é semelhante ao SVG, suportando apenas os recursos de desenho vetorial que estão em alta demanda para que o Android possa se concentrar no desempenho. pathData, por exemplo, tem o mesmo formato da string "d" do SVG.


Portanto, isso será relevante apenas quando o Lollipop se tornar popular o suficiente e, mesmo assim, não fornecer muitos recursos. :(
desenvolvedor de Android

Você conhece algum tutorial / amostra / vídeo das novas APIs vetoriais?
desenvolvedor Android de


1

A grande notícia é que o Google lançou o Android Support Library 23.2 Support Vector Drawables e Drawables vetoriais animados!

Mas obrigado às pessoas que portaram esta biblioteca antes do Google!

É aqui que as bibliotecas AppCompat são ótimas, elas podem trazer muitos dos novos recursos do Android para versões muito anteriores. Com a classe VectorDrawable recentemente implementada, os desenvolvedores agora podem usar imagens vetoriais desde a API 7 (Android 2.1 Eclair). Os vetores animados são um pouco mais limitados, indo apenas até a API 11 (Android 3.0 Honeycomb), mas ainda abrangem mais de 97% dos dispositivos em uso ativo hoje

Guia para usar:

Refira-se a " idade-dos-vetores " por @chrisbanes


1
Agradável! você pode compartilhar alguns exemplos / tutoriais sobre como usar a nova API de vetores da biblioteca de suporte?
desenvolvedor Android de

Certo ! já adicionei isso à minha lista de afazeres do fim de semana! :)
LOG_TAG

1
Obrigado. Se for curto, escreva também aqui.
desenvolvedor Android de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.