O Que É Recurso Grafico
Recurso gráfico no desenvolvimento Android
Todo mundo que já mexeu com Android precisa lidar com recursos gráficos de alguma forma. O problema é que a maioria das pessoas começa sem entender como o sistema gerencia essas imagens, ícones e desenhos vetoriais até ver um erro de memória ou um drawable que não carrega como deveria. Recurso gráfico é qualquer arquivo de imagem, desenho vetorial ou conjunto de propriedades que seu aplicativo emprega na interface. No ecossistema Android, isso inclui arquivos PNG, JPEG, WebP, XML de drawable, animações frame-by-frame e SVG convertido. Esses arquivos ficam na pasta res/ do projeto e são compilados em tabelas de referência acessíveis via R.drawable.nome_do_arquivo. O que as pessoas normalmente não percebem de primeira é que recurso gráfico no Android não é apenas o arquivo em si, mas todo o sistema de qualificação por densidade e configuração. Um mesmo ícone precisa existir em múltiplas resoluções porque a plataforma interpreta o sufixo da pasta como uma instrução direta sobre qual versão usar em cada dispositivo.
Como funciona na prática
A estrutura de pastas segue um padrão que parece simples mas gera confusão fácil se você não prestar atenção nos sufixos. As imagens ficam organizadas assim: res/drawable-mdpi para dispositivos de densidade média, aproximadamente 160 dpi. res/drawable-hdpi para alta densidade, cerca de 240 dpi.
res/drawable-xhdpi para extra alta, em torno de 320 dpi. res/drawable-xxhdpi para muito extra alta, aproximadamente 480 dpi. res/drawable-xxxhdpi para ultra extra alta, por volta de 640 dpi.

Quando você coloca uma imagem em drawable sem sufixo de densidade, o Android assume mdpi como padrão e faz escala automática para os outros. Isso funciona em casos simples, mas começa a falhar quando a imagem tem detalhes finos ou texto pequeno.
Problema real que eu enfrentei
Eu tive um caso específico em que um ícone de navegação parecia perfeito no emulador, mas ficava borrado nos dispositivos físicos com tela xhdpi. O problema era que eu tinha colocado apenas a versão hdpi na pasta drawable-hdpi e confiados no escalonamento automático. O resultado era um borrão visível porque o Android estava amplificando uma imagem de 240 dpi para 480 dpi, dobrando o tamanho sem informação adicional. A solução foi criar versões nativas para mdpi, hdpi, xhdpi, xxhdpi e xxxhdpi, cada uma com as dimensões corretas em pixels brutos. Em vez de manter tudo no mesmo tamanho físico e deixar o sistema escalar, eu defini o tamanho em dp e deixei o Android converter para pixels baseado na densidade. Uma imagem de 24dp precisa de 24px em mdpi, 36px em hdpi, 48px em xhdpi, 72px em xxhdpi e 96px em xxxhdpi. Essa conversão manual evita o borrão e também economiza memória porque o sistema não precisa reescalonar durante o runtime.
Drawables vetoriais
Drawable vetorial é outra camada dos recursos gráficos que merece atenção. Arquivos SVG convertidos para XML ficam na pasta drawable e são renderizados pelo sistema em tempo de execução. A vantagem é que você mantém um único arquivo e ele se adapta a qualquer densidade sem perda de qualidade. O problema é que nem todas as características do SVG são suportadas. Filtros complexos, gradientes com mais de dois stops e certas operações de path podem causar falha silenciosa ou renderização incorreta em versões mais antigas do Android. Eu aprendi isso na prática quando um ícone com gradiente complexo funcionava perfeitamente em testes mas aparecia completamente branco em dispositivos com Android 6.0. A solução foi simplificar o SVG, remover filtros desnecessários e testar em múltiplas versões do sistema antes de integrar ao projeto. Existe também a opção de usar a biblioteca VectorCompat do Google quando o suporte nativo não é suficiente, mas isso adiciona dependência e peso ao app.

Gerenciamento de memória com bitmaps
Quando você carrega bitmaps diretamente via BitmapFactory, há um detalhe importante sobre configuração de sampling. Carregar uma imagem de 2000x2000 pixels em uma ImageView que exibe 200x200 pixels é um desperdício claro de memória. O sistema aloca os 2000x2000 pixels inteiros mesmo que a tela mostre uma fração disso. A abordagem correta usa inSampleSize no BitmapFactory.Options para reduzir a resolução no momento do carregamento. Se a imagem original é quatro vezes maior que a área de exibição, definir inSampleSize como 4 faz o sistema carregar apenas um quarto dos pixels, reduzindo o uso de memória proporcionalmente. O cálculo ideal depende do layout e das dimensões reais do view, mas uma regra prática é calcular a razão entre largura e altura da imagem original versus a largura e altura do view alvo.
Pegadinhas comuns
Existem alguns pontos onde desenvolvedores iniciantes frequentemente erram. O primeiro é confundir dp com px. DP é uma unidade independente de densidade que o Android converte automaticamente. PX é pixels brutos e deve ser usado apenas quando você realmente precisa de controle absoluto sobre dimensões físicas na tela. O segundo erro é nomear arquivos de drawable com caracteres especiais ou maiúsculas. O gerador R só aceita letras minúsculas, números e underscore. Um arquivo chamado logo_Final.png vira um erro de compilação silencioso que pode levar tempo para identificar. O terceiro é colocar arquivos muito grandes na pasta drawable sem compressão adequada. PNGs com transparência que poderiam ser WebP, ou JPEGs salvos com qualidade máxima quando 80% seria suficiente. Cada megapixel extra em bitmap consome memória da heap do processo e em dispositivos com pouca RAM isso pode causar garbage collection frequente ou até oapp ser matado pelo sistema.
Limitações do sistema
Recurso gráfico no Android não é uma solução perfeita para todos os cenários. A principal limitação é que o sistema de qualificação por densidade exige múltiplas versões do mesmo arquivo, o que aumenta o tamanho do APK. Cada variante de resolução é um arquivo separado empacotado na aplicação. Outra limitação é o suporte inconsistente a formatos modernos. WebP ganhou suporte nativo a partir do Android 4.2.1, mas ainda existem dispositivos no mercado com versões mais antigas. Animadores Lottie e arquivos JSON de animação vetorial oferecem alternativas poderosas, mas adicionam complexidade e dependência externa. Quando o projeto exige alta performance gráfica, como jogos ou visualização de dados em tempo real, o sistema convencional de resources não é adequado. Nesses casos, texturas importadas diretamente via OpenGL ou bibliotecas como GPUImage são mais apropriadas, mas saem completamente do modelo padrão de recurso gráfico do Android.

Boas práticas
Manter consistência nos nomes dos arquivos, usar a pasta drawable certa para cada densidade e comprimir imagens antes de adicionar ao projeto são fundamentais. Ferramentas como ImageOptim, Squoosh ou o plugin Android Image Asset Studio do próprio Android Studio ajudam a gerar todas as variações automaticamente. Prefira drawables vetoriais quando possível, especialmente para ícones de interface que não precisam de fotos ou gradientes complexos. Vetores reduzem o tamanho do APK e eliminam a necessidade de múltiplas versões para diferentes densidades. Sempre teste em dispositivos reais com diferentes resoluções de tela, não apenas no emulador. O emulador muitas vezes mascara problemas de escalonamento e consumo de memória que aparecem claramente em hardware físico.
Conversão de SVG para VectorDrawable
O Android Studio oferece uma ferramenta integrada para converter SVG em VectorDrawable. Basta clicar com o botão direito no arquivo SVG, selecionar Convert Vector Drawable e o IDE gera o XML correspondente. O processo funciona bem para a maioria dos ícones simples, mas exige revisão manual quando o SVG original usa recursos avançados. Depois da conversão, é necessário verificar se todos os paths, cores e transformações foram preservados corretamente. Às vezes o gerador simplifica elementos complexos demais ou perde informações de alinhamento que eram importantes para o design original.
Cache de bitmaps
Em lists ou recycler views com muitas imagens, o cache de bitmaps é essencial para performance. O Glide, Picasso e a ImageLoader do Fresco são bibliotecas populares que resolvem problemas de carregamento assíncrono, cache em memória e disco, e dimensionamento automático. Escolher uma delas economiza horas de desenvolvimento comparado a implementar tudo manualmente. O caching reduz drasticamente o tempo de carregamento em repetidas exibições e diminui o tráfego de rede quando as imagens vêm de um servidor remoto. Sem cache, cada scroll em uma lista com fotos exige download completo, o que é imperceptível em Wi-Fi rápido mas se torna um problema sério em conexões móveis.

Galeria
-
O Que São Recursos Gráficos - NAZAEDU