Um recurso drawable é um conceito geral para um gráfico que pode ser mostrado na tela e
extraído com APIs como getDrawable(int) ou ativado
em um outro recurso XML com atributos, por exemplo, android:drawable e android:icon.
Há vários tipos de drawables:
- Arquivo bitmap
- Um arquivo gráfico de bitmap (PNG, WEBP, JPG ou GIF).
Cria um
BitmapDrawable. - Arquivo Nine-Patch
- Um arquivo PNG com regiões extensíveis para permitir que as imagens sejam redimensionadas com base no conteúdo (
.9.png). Cria umNinePatchDrawable. - Lista de camadas
- Um drawable que gerencia uma matriz de outros drawables. Eles são renderizados na ordem da matriz, então o
elemento com o índice maior é renderizado no topo. Cria um
LayerDrawable. - Lista de estados
- Um arquivo XML que referencia diferentes gráficos bitmap
para diversos estados, por exemplo, para usar uma imagem diferente quando um botão é pressionado.
Cria um
StateListDrawable. - Lista de níveis
- Um arquivo XML que define um drawable que gerencia vários drawables alternativos a que
foram atribuídos valores numéricos máximos. Cria um
LevelListDrawable. - Drawable de transição
- É um arquivo XML que define um drawable que pode fazer a transição cruzada entre dois recursos drawables.
Cria um
TransitionDrawable. - Drawable com recuo
- É um arquivo XML que define um drawable que envolve outro a uma distância especificada. É útil quando uma visualização precisa de um drawable de segundo plano menor do que os limites atuais da visualização.
- Drawable de recorte
- Um arquivo XML que define um drawable que recorta outro com base no
valor de nível atual. Cria um
ClipDrawable. - Drawable de escala
- Um arquivo XML que define um drawable que muda o tamanho de outro com base no
valor de nível atual. Cria um
ScaleDrawable.
- Drawable de formato
- É um arquivo XML que define um formato geométrico, incluindo cores e gradientes.
Cria um
GradientDrawable.
Para saber mais sobre como
criar um AnimationDrawable,
consulte o documento Recursos de animação.
Observação: um recurso de cor também pode ser
usado como um drawable em XML. Por exemplo, ao criar um drawable de lista de estados,
é possível referenciar um recurso de cor para o atributo android:drawable (android:drawable="@color/green").
Bitmap
Imagem de bitmap. O Android oferece suporte a arquivos bitmap nestes formatos: PNG (recomendado), WEBP (recomendado, exige o nível 17 da API ou mais recente), JPG (aceitável), GIF (não recomendado).
É possível referenciar um arquivo bitmap diretamente, usando o nome de arquivo como o ID de recurso ou criando um ID de recurso de alias no XML.
Observação: é possível otimizar arquivos bitmap automaticamente com compressão
de imagem sem perda pela ferramenta aapt durante o processo de build. Por
exemplo, um PNG de cores verdadeiras que não exige mais de 256 cores pode ser convertido em um PNG de
8 bits com uma paleta de cores. Isso resulta em uma imagem com a mesma qualidade que requer menos
memória.
Portanto, os binários de imagem colocados nesse diretório podem mudar durante o build. Se
você planeja ler uma imagem como um bitstream para convertê-la em um bitmap, coloque suas imagens na
pasta res/raw/, onde não serão otimizadas.
Arquivo bitmap
Os arquivos bitmap são arquivos PNG, WEBP, JPG ou GIF. O Android cria um recurso
Drawable para qualquer um desses arquivos quando você os salva no diretório res/drawable/.
- Localização do arquivo:
res/drawable/filename.png(.png,.webp,.jpgou.gif)
O nome de arquivo é o ID do recurso.- Tipo de dados do recurso compilado:
- Ponteiro do recurso para uma
BitmapDrawable. - Referência de recurso:
-
Em Java:
R.drawable.filename
Em XML:@[package:]drawable/filename - Exemplo:
- Com uma imagem salva em
res/drawable/myimage.png, esse XML de layout aplica a imagem a uma visualização:<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/myimage" />
O código do aplicativo abaixo extrai a imagem como um
Drawable:Kotlin
val drawable: Drawable? = ResourcesCompat.
getDrawable(resources, R.drawable.myimage, null)Java
Resources res =
getResources(); Drawable drawable = ResourcesCompat.getDrawable(res, R.drawable.myimage, null); - Confira também:
Bitmap XML
O bitmap XML é um recurso definido no XML que aponta para um arquivo desse tipo. O efeito é um alias para um arquivo de bitmap bruto. O XML pode especificar outras propriedades para o bitmap, por exemplo, pontilhamento e agrupamento.
Observação: você pode usar um elemento <bitmap> como filho de
um elemento <item>. Por
exemplo, ao criar uma lista de estados ou uma lista de camadas,
é possível excluir o atributo android:drawable
de um elemento <item> e aninhar um <bitmap> dentro dele
que define o item drawable.
- Localização do arquivo:
res/drawable/filename.xml
O nome de arquivo é o ID do recurso.- Tipo de dados do recurso compilado:
- Ponteiro do recurso para uma
BitmapDrawable. - Referência de recurso:
-
Em Java:
R.drawable.filename
Em XML:@[package:]drawable/filename - sintaxe:
-
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@[package:]drawable/drawable_resource" android:antialias=["true" | "false"] android:dither=["true" | "false"] android:filter=["true" | "false"] android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" | "fill_vertical" | "center_horizontal" | "fill_horizontal" | "center" | "fill" | "clip_vertical" | "clip_horizontal"] android:mipMap=["true" | "false"] android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
- elementos:
- Exemplo:
-
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon" android:tileMode="repeat" />
- Confira também:
Nine-Patch
Um NinePatch é uma imagem PNG em que é possível definir regiões extensíveis
que o Android dimensiona quando o conteúdo dentro da visualização excede os limites normais da imagem. Normalmente,
esse tipo de imagem é atribuído como o segundo plano de uma visualização que tem pelo menos uma dimensão definida
como "wrap_content".
Quando a visualização cresce para acomodar o conteúdo, a imagem Nine-Patch
também é redimensionada para corresponder ao tamanho da visualização. Um exemplo de uso de uma imagem Nine-Patch é o
segundo plano usado pelo widget padrão do Android Button, que precisa se estender para
acomodar o texto (ou a imagem) dentro do botão.
Da mesma forma que acontece com um bitmap normal, é possível referenciar um arquivo Nine-Patch diretamente ou em um recurso definido pelo XML.
Para conferir uma discussão completa sobre como criar um arquivo Nine-Patch com regiões esticáveis, consulte Criar bitmaps redimensionáveis (arquivos 9-patch).
Arquivo Nine-Patch
- Localização do arquivo:
res/drawable/filename.9.png
O nome de arquivo é o ID do recurso.- Tipo de dados do recurso compilado:
- Ponteiro do recurso para uma
NinePatchDrawable. - Referência de recurso:
-
Em Java:
R.drawable.filename
Em XML:@[package:]drawable/filename - Exemplo:
- Com uma imagem salva em
res/drawable/myninepatch.9.png, esse XML de layout aplica o Nine-Patch a uma visualização:<Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/myninepatch" />
- Confira também:
XML Nine-Patch
O XML Nine-Patch é um recurso definido no XML que aponta para um arquivo Nine-Patch. O XML pode especificar o pontilhamento para a imagem.
- Localização do arquivo:
res/drawable/filename.xml
O nome de arquivo é o ID do recurso.- Tipo de dados do recurso compilado:
- Ponteiro do recurso para uma
NinePatchDrawable. - Referência de recurso:
-
Em Java:
R.drawable.filename
Em XML:@[package:]drawable/filename - sintaxe:
-
<?xml version="1.0" encoding="utf-8"?> <nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:src="@[package:]drawable/drawable_resource" android:dither=["true" | "false"] />
- elementos:
- Exemplo:
-
<?xml version="1.0" encoding="utf-8"?> <nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/myninepatch" android:dither="false" />
Lista de camadas
Um LayerDrawable é um objeto drawable
que gerencia uma matriz de outros drawables. Cada drawable na lista é renderizado na ordem da
lista. O último drawable da lista é renderizado no topo.
Cada drawable é representado por um elemento <item> dentro de um único elemento <layer-list>.
- Localização do arquivo:
res/drawable/filename.xml
O nome de arquivo é o ID do recurso.- Tipo de dados do recurso compilado:
- Ponteiro do recurso para uma
LayerDrawable. - Referência de recurso:
-
Em Java:
R.drawable.filename
Em XML:@[package:]drawable/filename - sintaxe:
-
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@[package:]drawable/drawable_resource" android:id="@[+][package:]id/resource_name" android:top="dimension" android:right="dimension" android:bottom="dimension" android:left="dimension" /> </layer-list>
- elementos:
- Exemplo:
- Arquivo XML salvo em
res/drawable/layers.xml:<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <bitmap android:src="@drawable/android_red" android:gravity="center" /> </item> <item android:top="10dp" android:left="10dp"> <bitmap android:src="@drawable/android_green" android:gravity="center" /> </item> <item android:top="20dp" android:left="20dp"> <bitmap android:src="@drawable/android_blue" android:gravity="center" /> </item> </layer-list>
Esse exemplo usa um elemento
<bitmap>aninhado para definir o recurso drawable para cada item com uma gravidade"center". Isso garante que nenhuma das imagens seja redimensionada para corresponder ao tamanho do contêiner devido ao redimensionamento causado por imagens deslocadas.Este layout XML aplica o drawable a uma visualização:
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/layers" />
O resultado é uma pilha de imagens incrementalmente deslocadas:
- Confira também:
Lista de estados
StateListDrawable é um objeto drawable definido no XML
que usa várias imagens para representar o mesmo gráfico, dependendo do estado
do objeto. Por exemplo, o estado de um widget Button pode ser tocado, focado
ou nenhuma dessas opções. Ao usar um drawable de lista de estados, você pode fornecer uma imagem de plano de fundo diferente para cada
estado.
Você descreve uma lista de estados em um arquivo XML. Cada gráfico é representado por um elemento <item> dentro de um único elemento <selector>. Cada <item>
usa vários atributos para descrever o estado em que ele é usado como o gráfico do
drawable.
Durante cada mudança, a lista de estados é percorrida de cima a baixo, e o primeiro item que corresponde ao estado atual é usado. A seleção não se baseia na "melhor" correspondência, mas no primeiro item que atende aos critérios mínimos do estado.
- Localização do arquivo:
res/drawable/filename.xml
O nome de arquivo é o ID do recurso.- Tipo de dados do recurso compilado:
- Ponteiro do recurso para uma
StateListDrawable. - Referência de recurso:
-
Em Java:
R.drawable.filename
Em XML:@[package:]drawable/filename - sintaxe:
-
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:constantSize=["true" | "false"] android:dither=["true" | "false"] android:variablePadding=["true" | "false"] > <item android:drawable="@[package:]drawable/drawable_resource" android:state_pressed=["true" | "false"] android:state_focused=["true" | "false"] android:state_hovered=["true" | "false"] android:state_selected=["true" | "false"] android:state_checkable=["true" | "false"] android:state_checked=["true" | "false"] android:state_enabled=["true" | "false"] android:state_activated=["true" | "false"] android:state_window_focused=["true" | "false"] /> </selector>
- elementos:
- Exemplo:
- Arquivo XML salvo em
res/drawable/button.xml:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/button_pressed" /> <!-- pressed --> <item android:state_focused="true" android:drawable="@drawable/button_focused" /> <!-- focused --> <item android:state_hovered="true" android:drawable="@drawable/button_focused" /> <!-- hovered --> <item android:drawable="@drawable/button_normal" /> <!-- default --> </selector>
Este XML de layout aplica o drawable de lista de estados a um botão:
<Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/button" />
- Confira também:
Lista de níveis
Um drawable que gerencia vários drawables alternativos a que foram atribuídos valores numéricos
máximos. Definir o valor de nível do drawable com setLevel() carrega o recurso drawable na
lista de nível que tem um valor de android:maxLevel maior ou igual ao
transmitido ao método.
- Localização do arquivo:
res/drawable/filename.xml
O nome de arquivo é o ID do recurso.- Tipo de dados do recurso compilado:
- Ponteiro do recurso para uma
LevelListDrawable. - Referência de recurso:
-
Em Java:
R.drawable.filename
Em XML:@[package:]drawable/filename - sintaxe:
-
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/drawable_resource" android:maxLevel="integer" android:minLevel="integer" /> </level-list>
- elementos:
- Exemplo:
-
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/status_off" android:maxLevel="0" /> <item android:drawable="@drawable/status_on" android:maxLevel="1" /> </level-list>
Quando isso se aplica a uma
View, o nível pode ser modificado comsetLevel()ousetImageLevel(). - Confira também:
Drawable de transição
TransitionDrawable é um objeto drawable
que pode fazer a transição entre dois outros recursos drawables.
Cada drawable é representado por um elemento <item> dentro de um único elemento <transition>. O máximo aceito é dois itens. Para fazer a transição para frente, chame
startTransition(). Para
fazer a transição para trás, chame reverseTransition().
- Localização do arquivo:
res/drawable/filename.xml
O nome de arquivo é o ID do recurso.- Tipo de dados do recurso compilado:
- Ponteiro do recurso para uma
TransitionDrawable. - Referência de recurso:
-
Em Java:
R.drawable.filename
Em XML:@[package:]drawable/filename - sintaxe:
-
<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@[package:]drawable/drawable_resource" android:id="@[+][package:]id/resource_name" android:top="dimension" android:right="dimension" android:bottom="dimension" android:left="dimension" /> </transition>
- elementos: