Utilizando Drawable Tinting programaticamente e seus impactos

Anderson Ribeiro e Silva
CI&T Mobile
Published in
2 min readMay 17, 2016

No dia 05 de maio, tive a oportunidade de apresentar um Lightning Talk sobre um problema que tive com Drawable Tint no Android. O problema consistia em alguns ícones na aplicação aparecer com cores erradas, por exemplo, eu pintava o ícone de preto, mas ele aparecia branco.

Com o Android Lollipop, veio a possibilidade de aplicar cores a imagens. Isso é muito interessante, pois evita a necessidade de importar várias imagens idênticas para o projeto.

Usar esse recurso é muito simples, e ele também está disponível na SupportLibrary, para funcionar em compatibilidade com as APIs pré-Lollipop. Um exemplo de como usar esse recurso pode ser encontrado em:

Mas teve um ponto que passou desapercebido por mim. Para pintar um ícone, eu estava usando o seguinte código:

Esse código funciona bem, mas existe um problema quando queremos apresentar o mesmo ícone com cores diferentes na mesma tela para as APIs 21 ou anteriores. Nesses dispositivos, todos os drawables acabam recebendo a última cor aplicada. Resolver esse problema é simples, basta especificar que você irá alterar o drawable, chamando Drawable.mutate(). Ficaria assim:

Isso já resolve o problema, mas me veio a cabeça as implicações que isso pode trazer. Fiz alguns experimentos e percebi que usar o Drawable.mutate() pode aumentar bastante o uso de memória em determinados casos, ele basicamente faz uma cópia do Bitmap (nas APIs 21 ou anteriores) cada vez que ele é chamado. Portanto, o ideal é fazer um cache para o caso de precisar pintar vários itens em uma lista. Exemplo:

Deixei no github os experimentos feitos.

--

--