Recursos drawables

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Um recurso drawable é um conceito geral para um gráfico que pode ser mostrado na tela e que pode ser extraído com APIs como getDrawable(int) ou ser aplicado a outro recurso XML com atributos como 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 o redimensionamento de imagens com base no conteúdo (.9.png). Cria um NinePatchDrawable.
Lista de camadas
Um drawable que gerencia uma matriz de outros drawables. Eles são renderizados na ordem da matriz. O elemento com o índice maior vai ser renderizado no topo. Cria um LayerDrawable.
Lista de estados
É um arquivo XML que referencia diferentes gráficos de bitmaps 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, aos quais 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 de encarte
É um arquivo XML que define um drawable que envolve outro a uma distância especificada. É útil quando uma visualização precisa de um segundo plano drawable 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 do drawable. 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.

Consulte também o documento Recurso de animação para saber como criar um AnimationDrawable.

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 de 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 compilação. 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 vai resultar em uma imagem de qualidade igual, mas que exige menos memória. Esteja ciente de que os binários de imagem colocados nesse diretório podem mudar durante a criação. Se você planeja ler uma imagem como um bitstream, em vez de converter em um bitmap, coloque suas imagens na pasta res/raw/, onde não vão ser otimizadas.

Arquivo Bitmap

Os bitmaps 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, .jpg ou .gif)
O nome do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um 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 definir outras propriedades para o bitmap, como 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 do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um 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:
<bitmap>
Define a origem do bitmap as propriedades dele.

atributos:

xmlns:android
String. Define o namespace XML, que precisa ser "http://schemas.android.com/apk/res/android". Isso é necessário apenas se o <bitmap> for o elemento raiz. É desnecessário quando o <bitmap> está aninhado dentro de um <item>.
android:src
Recurso drawable. Obrigatório. Referência a um recurso drawable.
android:antialias
Booleano. Ativa ou desativa a suavização.
android:dither
Booleano. Ativa ou desativa o pontilhamento do bitmap se ele não tiver a mesma configuração de pixels que a tela, por exemplo, um bitmap ARGB 8888 com uma tela RGB 565.
android:filter
Booleano. Ativa ou desativa a filtragem do bitmap. A filtragem é usada quando o bitmap é encolhido ou estendido para suavizar a aparência.
android:gravity
Palavra-chave. Define a gravidade bitmap. A gravidade indica onde posicionar o drawable no contêiner se o bitmap for menor que ele.

Precisa ser um ou mais dos valores constantes (separados por “|”) abaixo:

ValorDescrição
top Coloca o objeto no topo do contêiner sem mudar o tamanho.
bottom Coloca o objeto na parte de baixo do contêiner sem mudar o tamanho.
left Coloca o objeto na borda esquerda do recipiente sem mudar o tamanho.
right Coloca o objeto na borda direita do contêiner sem mudar o tamanho.
center_vertical Coloca o objeto no centro vertical do contêiner sem mudar o tamanho.
fill_vertical Aumenta o tamanho vertical do objeto, se necessário, para que ele preencha completamente o contêiner.
center_horizontal Coloca o objeto no centro horizontal do contêiner sem mudar o tamanho.
fill_horizontal Aumenta o tamanho horizontal do objeto, se necessário, para que ele preencha completamente o contêiner.
center Coloca o objeto no centro do contêiner, nos eixos vertical e horizontal, sem mudar o tamanho.
fill Aumenta o tamanho horizontal e vertical do objeto, se necessário, para que ele preencha completamente o contêiner. Esse é o padrão.
clip_vertical Outra opção que pode ser definida para que as bordas de cima e/ou de baixo do filho sejam recortadas nos limites do contêiner. O recorte se baseia na gravidade vertical: uma gravidade no topo recorta a borda de baixo, uma gravidade na parte de baixo recorta a borda de cima e nenhuma gravidade recorta as duas bordas.
clip_horizontal Outra opção para definir se as bordas esquerda e/ou direita do filho vão ser recortadas nos limites do contêiner. O recorte se baseia na gravidade horizontal: uma gravidade à esquerda recorta a borda direita, uma gravidade à direita recorta a borda esquerda e nenhuma gravidade recorta as duas bordas.
android:mipMap
Booleano. Ativa ou desativa a dica de mipmap. Consulte setHasMipMap() para mais informações. O valor padrão é “false”.
android:tileMode
Palavra-chave. Define o modo agrupado. Quando o modo agrupado estiver ativado, o bitmap vai ser repetido. A gravidade é ignorada quando o modo agrupado está ativado.

Precisa ser um dos valores constantes abaixo:

ValorDescrição
disabled Não agrupa o bitmap. Esse é o valor padrão.
clamp Replica a cor da borda se o sombreador renderizar fora dos limites originais.
repeat Repete a imagem do sombreador na horizontal e na vertical.
mirror Repete a imagem do sombreador na horizontal e na vertical, alternando imagens espelhadas para que imagens adjacentes sempre fiquem emendadas.
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 segundo plano de uma visualização que tenha pelo menos uma dimensão configurada como "wrap_content" e, quando a visualização é expandida 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 deve se estender para acomodar o texto (ou a imagem) dentro do botão.

Da mesma forma que 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 extensíveis, consulte o documento Gráficos 2D.

Arquivo Nine-Patch

localização do arquivo:
res/drawable/filename.9.png
O nome do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um 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 do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um 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:
<nine-patch>
Define a origem do Nine-Patch e as propriedades dele.

atributos:

xmlns:android
String. Obrigatório. Define o namespace XML, que precisa ser "http://schemas.android.com/apk/res/android".
android:src
Recurso drawable. Obrigatório. Referência a um arquivo Nine-Patch.
android:dither
Booleano. Ativa ou desativa o pontilhamento do bitmap se ele não tiver a mesma configuração de pixels que a tela, por exemplo, um bitmap ARGB 8888 com uma tela RGB 565.
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 do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um 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:
<layer-list>
Obrigatório. Precisa ser o elemento raiz. Contém um ou mais elementos <item>.

atributos:

xmlns:android
String. Obrigatório. Define o namespace XML, que precisa ser "http://schemas.android.com/apk/res/android".
<item>
Define um drawable para ser colocado na camada de drawables em uma posição definida pelos atributos. Precisa ser um filho de um elemento <layer-list>. Aceita elementos <bitmap> filhos.

atributos:

android:drawable
Recurso drawable. Obrigatório. Referência a um recurso drawable.
android:id
ID de recurso. ID de recurso único para o drawable. Para criar um novo ID de recurso para este item, use o formato: "@+id/name". O símbolo de adição indica que você precisa fazer a criação dele como um novo ID. Esse identificador é útil para extrair e modificar o drawable com View.findViewById() ou Activity.findViewById().
android:top
Dimensão. O deslocamento de cima, como um valor de dimensão ou recurso de dimensão.
android:right
Dimensão. O deslocamento à direita, como um valor de dimensão ou um recurso de dimensão.
android:bottom
Dimensão. O deslocamento de baixo, como um valor de dimensão ou recurso de dimensão.
android:left
Dimensão. O deslocamento à esquerda, como um valor de dimensão ou recurso de dimensão.

Por padrão, todos os itens drawable são redimensionados para corresponder ao tamanho da visualização que os contém. Colocar as imagens em uma lista de camadas em diferentes posições pode aumentar o tamanho da visualização e redimensionar algumas imagens. Para evitar redimensionar os itens na lista, use um elemento <bitmap> dentro do elemento <item> para especificar o drawable e definir a gravidade de algo que não precisa ser redimensionado, como "center". Por exemplo, o <item> abaixo define um item que se redimensiona para corresponder à visualização que o contém:

<item android:drawable="@drawable/image" />

Para evitar o redimensionamento, o exemplo abaixo usa um elemento <bitmap> com gravidade centralizada:

<item>
  <bitmap android:src="@drawable/image"
          android:gravity="center" />
</item>
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>

Observe que 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.

Esse 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 diferentes para representar o mesmo gráfico, dependendo do estado do objeto. Por exemplo: um widget Button pode existir em um de vários estados (pressionado, com foco ou nenhum dos dois) e, usando um drawable de lista de estados, é possível fornecer uma imagem de plano de fundo diferente para cada estado.

Você pode descrever uma lista de estado 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 precisa ser usado como o gráfico do drawable.

Durante cada mudança, a lista de estados é percorrida de cima para baixo, e o primeiro item que corresponde ao estado atual vai ser usado. A seleção não se baseia na "melhor correspondência", mas simplesmente no primeiro item que atenda aos critérios mínimos do estado.

localização do arquivo:
res/drawable/filename.xml
O nome do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um 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:
<selector>
Obrigatório. Precisa ser o elemento raiz. Contém um ou mais elementos <item>.

atributos:

xmlns:android
String. Obrigatório. Define o namespace XML, que precisa ser "http://schemas.android.com/apk/res/android".
android:constantSize
Booleano. É definido como "true" se o tamanho interno relatado do drawable permanecer constante à medida que o estado muda (o tamanho é o máximo de todos os estados). É "false" se o tamanho variar de acordo com o estado atual. O valor padrão é "false".
android:dither
Booleano. É definido como "true" para permitir o pontilhamento do bitmap se ele não tiver a mesma configuração de pixel da tela (por exemplo, um bitmap ARGB 8888 com uma tela RGB 565). É "false" para desativar o pontilhamento. O padrão é "true".
android:variablePadding
Booleano. É definido como "true" se o padding do drawable mudar com base no estado atual selecionado. É "false" se o padding precisar permanecer o mesmo (com base no padding máximo de todos os estados). Ativar esse recurso exige que você lide com a execução do layout quando o estado muda, o que frequentemente não é aceito. O valor padrão é "false".
<item>
Define um drawable para ser usado durante certos estados, como descrito por seus atributos. Precisa ser um filho de um elemento <selector>.

atributos:

android:drawable
Recurso drawable. Obrigatório. Referência a um recurso drawable.
android:state_pressed
Booleano. É definido como "true" se o item precisa ser usado quando o objeto for pressionado, por exemplo, quando um botão for pressionado ou clicado. É "false" se o item precisa ser usado no estado padrão, não pressionado.
android:state_focused
Booleano. É definido como "true" se este item precisar ser usado quando o objeto tiver o foco de entrada, como quando o usuário seleciona uma entrada de texto. É "false" se o item precisar ser usado no estado padrão sem foco.
android:state_hovered
Booleano. É definido como "true" se este item precisar ser usado quando o cursor estiver passando sobre o objeto. É "false" se for necessário usar este item no estado padrão, sem o cursor passando por cima. Geralmente, esse drawable é o mesmo usado para o estado "focado".

Introduzido no nível 14 da API.

android:state_selected
Booleano. É definido como "true" se for necessário usar esse item quando o objeto é a seleção atual do usuário ao navegar com um controle direcional (como ao navegar em uma lista com um botão direcional). É "false" se for necessário usar esse item quando o objeto não estiver selecionado.

O estado selecionado é usado quando o foco (android:state_focused) não é suficiente, por exemplo, quando a visualização em lista tem foco e um item dentro dela é selecionado com um botão direcional.

android:state_checkable
Booleano. É definido como "true" se o item precisa ser usado quando o objeto puder ser selecionado. É "false" se o item precisa ser usado quando o objeto não puder ser selecionado. Essa função é útil somente se o objeto puder fazer a transição entre um widget selecionável e não selecionável.
android:state_checked
Booleano. É definido como "true" se o item precisa ser usado quando o objeto estiver marcado. É "false" se ele precisa ser usado quando objeto estiver desmarcado.
android:state_enabled
Booleano. É definido como "true" se o item precisa ser usado quando o objeto for ativado (capaz de receber eventos de toque ou clique). É "false" se ele precisa ser usado quando o objeto está desativado.
android:state_activated
Booleano. É definido como "true" se o item precisar ser usado quando o objeto for ativado como a seleção persistente (por exemplo, para "destacar" o item da lista selecionado anteriormente em uma visualização de navegação persistente). É "false" se precisar ser usado quando o objeto não estiver ativado.

Introduzido no nível 11 da API.

android:state_window_focused
Booleano. É definido como "true" se o item precisa ser usado quando a janela do aplicativo estiver em foco (o aplicativo está em primeiro plano). É "false" se este item precisa ser usado quando a janela do aplicativo não tiver foco, por exemplo, se uma aba de notificações estiver suspensa ou uma caixa de diálogo for mostrada.

Observação: não esqueça que o Android aplica o primeiro item na lista de estados que corresponde ao estado atual do objeto. Se o primeiro item na lista não contém nenhum dos atributos de estado acima, ele é aplicado todas as vezes. É por isso que o valor padrão deve sempre ser o último (como demonstrado no exemplo abaixo).

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>

Esse 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, aos quais foram atribuídos valores numéricos máximos. A definição do valor de nível do drawable com setLevel() carrega o recurso do drawable na lista de nível que tem um valor de android:maxLevel maior ou igual ao valor transmitido ao método.

localização do arquivo:
res/drawable/filename.xml
O nome do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um 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:
<level-list>
Precisa ser o elemento raiz. Contém um ou mais elementos <item>.

atributos:

xmlns:android
String. Obrigatório. Define o namespace XML, que precisa ser "http://schemas.android.com/apk/res/android".
<item>
Define um drawable para ser usado em um determinado nível.

atributos:

android:drawable
Recurso drawable. Obrigatório. Referência a um recurso drawable que vai ser colocado em um encarte.
android:maxLevel
Número inteiro. O nível máximo permitido para o item.
android:minLevel
Número inteiro. O nível mínimo permitido para o item.
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 com setLevel() ou setImageLevel().

confira também:

Drawable de transição

TransitionDrawable é um objeto drawable que pode fazer a transição entre dois 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 do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um 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:
<transition>
Obrigatório. Precisa ser o elemento raiz. Contém um ou mais elementos <item>.

atributos:

xmlns:android
String. Obrigatório. Define o namespace XML, que precisa ser "http://schemas.android.com/apk/res/android".
<item>
Define um drawable que é usado como parte da transição de drawables. Precisa ser um filho de um elemento <transition>. Aceita elementos <bitmap> filhos.

atributos:

android:drawable
Recurso drawable. Obrigatório. Referência a um recurso drawable.
android:id
ID de recurso. ID de recurso único para o drawable. Para criar um novo ID de recurso para este item, use o formato: "@+id/name". O símbolo de adição indica que você precisa fazer a criação dele como um novo ID. Esse identificador é útil para extrair e modificar o drawable com View.findViewById() ou Activity.findViewById().
android:top
Número inteiro. O deslocamento de cima em pixels.
android:right
Número inteiro. O deslocamento direito em pixels.
android:bottom
Número inteiro. O deslocamento de baixo em pixels.
android:left
Número inteiro. O deslocamento esquerdo em pixels.
Exemplo:
Arquivo XML salvo em res/drawable/transition.xml:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/on" />
    <item android:drawable="@drawable/off" />
</transition>

Esse layout XML aplica o drawable a uma visualização:

<ImageButton
    android:id="@+id/button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/transition" />

O código abaixo executa uma transição de 500 ms do primeiro item para o segundo:

Kotlin

val button: ImageButton = findViewById(R.id.button)
val drawable: Drawable = button.drawable
if (drawable is TransitionDrawable) {
    drawable.startTransition(500)
}

Java

ImageButton button = (ImageButton) findViewById(R.id.button);
Drawable drawable = button.getDrawable();
if (drawable instanceof TransitionDrawable) {
    ((TransitionDrawable) drawable).startTransition(500);
}
confira também:

Drawable de encarte

É um drawable definido em XML que faz o encarte de outro drawable em uma distância especificada. É útil quando uma visualização precisa de um segundo plano menor do que os limites atuais da visualização.

localização do arquivo:
res/drawable/filename.xml
O nome do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um InsetDrawable.
referência de recurso:
Em Java: R.drawable.filename
Em XML: @[package:]drawable/filename
sintaxe:
<?xml version="1.0" encoding="utf-8"?>
<inset
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:insetTop="dimension"
    android:insetRight="dimension"
    android:insetBottom="dimension"
    android:insetLeft="dimension" />
elementos:
<inset>
Define o drawable de encarte. Precisa ser o elemento raiz.

atributos:

xmlns:android
String. Obrigatório. Define o namespace XML, que precisa ser "http://schemas.android.com/apk/res/android".
android:drawable
Recurso drawable. Obrigatório. Referência a um recurso drawable que vai ser colocado em um encarte.
android:insetTop
Dimensão. Encarte de cima, como um valor de dimensão ou um recurso de dimensão
.
android:insetRight
Dimensão. O encarte direito, como um valor de dimensão ou um recurso de dimensão
.
android:insetBottom
Dimensão. O encarte de baixo, como um valor de dimensão ou um recurso de dimensão
.
android:insetLeft
Dimensão. O encarte esquerdo, como um valor de dimensão ou um recurso de dimensão.
Exemplo:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/background"
    android:insetTop="10dp"
    android:insetLeft="10dp" />
confira também:

Drawable de recorte

É um drawable definido em XML que, com base no nível atual, recorta outro drawable. É possível controlar o quanto o drawable filho é recortado em largura e altura com base no nível, bem como usar uma gravidade para controlar onde ele é posicionado no contêiner geral. Esse drawable é usado com mais frequência para implementar elementos como barras de progresso.

localização do arquivo:
res/drawable/filename.xml
O nome do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um ClipDrawable.
referência de recurso:
Em Java: R.drawable.filename
Em XML: @[package:]drawable/filename
sintaxe:
<?xml version="1.0" encoding="utf-8"?>
<clip
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:clipOrientation=["horizontal" | "vertical"]
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                     "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                     "center" | "fill" | "clip_vertical" | "clip_horizontal"] />
elementos:
<clip>
Define o drawable de recorte. Precisa ser o elemento raiz.

atributos:

xmlns:android
String. Obrigatório. Define o namespace XML, que precisa ser "http://schemas.android.com/apk/res/android".
android:drawable
Recurso drawable. Obrigatório. Referência a um recurso drawable a ser recortado.
android:clipOrientation
Palavra-chave. A orientação para o recorte.

Precisa ser um dos valores constantes abaixo:

ValorDescrição
horizontal Recorta o drawable horizontalmente.
vertical Recorta o drawable verticalmente.
android:gravity
Palavra-chave. Especifica onde recortar dentro do drawable.

Precisa ser um ou mais dos valores constantes (separados por “|”) abaixo:

ValorDescrição
top Coloca o objeto no topo do contêiner sem mudar o tamanho. Quando clipOrientation é "vertical", o recorte ocorre na parte de baixo do drawable.
bottom Coloca o objeto na parte de baixo do recipiente sem alterar o tamanho dele. Quando clipOrientation é "vertical", o recorte ocorre na parte de cima do drawable.
left Coloca o objeto na borda esquerda do contêiner sem mudar o tamanho. Esse é o padrão. Quando clipOrientation é "horizontal", o recorte ocorre no lado direito do drawable. Esse é o padrão.
right Coloca o objeto na borda direita do recipiente sem alterar o tamanho. Quando clipOrientation é "horizontal", o recorte ocorre no lado esquerdo do drawable.
center_vertical Coloca o objeto no centro vertical do recipiente sem alterar o tamanho. O recorte se comporta da mesma forma quando a gravidade é "center".
fill_vertical Aumenta o tamanho vertical do objeto, se necessário, para que ele preencha completamente o recipiente. Quando clipOrientation é "vertical", não ocorre nenhum recorte porque o drawable preenche o espaço vertical (a não ser que o nível do drawable seja 0, quando não estiver visível).
center_horizontal Coloca o objeto no centro horizontal do recipiente sem alterar o tamanho. O recorte se comporta da mesma forma quando a gravidade é "center".
fill_horizontal Aumenta o tamanho horizontal do objeto, se necessário, para que ele preencha completamente o recipiente. Quando clipOrientation é "horizontal", não ocorre nenhum recorte porque o drawable preenche o espaço horizontal (a não ser que o nível do drawable seja 0, quando não estiver visível).
center Coloca o objeto no centro do contêiner, nos eixos vertical e horizontal, sem mudar o tamanho. Quando clipOrientation é "horizontal", o recorte ocorre à esquerda e à direita. Quando clipOrientation é "vertical", o recorte ocorre em cima e embaixo.
fill Aumenta o tamanho horizontal e vertical do objeto, se necessário, para que ele preencha completamente o contêiner. Não ocorre nenhum recorte porque o drawable preenche o espaço horizontal e vertical (a não ser que o nível do drawable seja 0, quando não estiver visível).
clip_vertical Outra opção que pode ser definida para que as bordas de cima e/ou de baixo do filho sejam recortadas nos limites do contêiner. O recorte se baseia na gravidade vertical: uma gravidade no topo recorta a borda de baixo, uma gravidade na parte de baixo recorta a borda de cima e nenhuma gravidade recorta as duas bordas.
clip_horizontal Outra opção para definir se as bordas esquerda e/ou direita do filho vão ser recortadas nos limites do contêiner. O recorte se baseia na gravidade horizontal: uma gravidade à esquerda recorta a borda direita, uma gravidade à direita recorta a borda esquerda e nenhuma gravidade recorta as duas bordas.
Exemplo:
Arquivo XML salvo em res/drawable/clip.xml:
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/android"
    android:clipOrientation="horizontal"
    android:gravity="left" />

O XML de layout abaixo aplica o drawable de recorte a uma visualização:

<ImageView
    android:id="@+id/image"
    android:src="@drawable/clip"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />

O código abaixo acessa o drawable e aumenta a quantidade de recorte para revelar progressivamente a imagem:

Kotlin

val imageview: ImageView = findViewById(R.id.image)
val drawable: Drawable = imageview.background
if (drawable is ClipDrawable) {
    drawable.level = drawable.level + 1000
}

Java

ImageView imageview = (ImageView) findViewById(R.id.image);
Drawable drawable = imageview.getBackground();
if (drawable instanceof ClipDrawable) {
    ((ClipDrawable)drawable).setLevel(drawable.getLevel() + 1000);
}

Aumentar o nível reduz a quantidade de recorte e revela lentamente a imagem. Confira como ele fica em um nível de 7.000:

Observação: o nível padrão é 0, que é totalmente recortado para que a imagem não esteja visível. Quando o nível é 10.000, a imagem não é recortada e fica completamente visível.

confira também:

Drawable de escala

É um drawable definido em XML que muda o tamanho de outro drawable com base no nível atual.

localização do arquivo:
res/drawable/filename.xml
O nome do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um ScaleDrawable.
referência de recurso:
Em Java: R.drawable.filename
Em XML: @[package:]drawable/filename
sintaxe:
<?xml version="1.0" encoding="utf-8"?>
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                          "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                          "center" | "fill" | "clip_vertical" | "clip_horizontal"]
    android:scaleHeight="percentage"
    android:scaleWidth="percentage" />
elementos:
<scale>
Define o drawable de escala. Precisa ser o elemento raiz.

atributos:

xmlns:android
String. Obrigatório. Define o namespace XML, que precisa ser "http://schemas.android.com/apk/res/android".
android:drawable
Recurso drawable. Obrigatório. Referência a um recurso drawable.
android:scaleGravity
Palavra-chave. Especifica a posição da gravidade após o redimensionamento.

Precisa ser um ou mais dos valores constantes (separados por “|”) abaixo:

ValorDescrição
top Coloca o objeto no topo do contêiner sem mudar o tamanho.
bottom Coloca o objeto na parte de baixo do contêiner sem mudar o tamanho.
left Coloca o objeto na borda esquerda do contêiner sem mudar o tamanho. Esse é o padrão.
right Coloca o objeto na borda direita do contêiner sem mudar o tamanho.
center_vertical Coloca o objeto no centro vertical do contêiner sem mudar o tamanho.
fill_vertical Aumenta o tamanho vertical do objeto, se necessário, para que ele preencha completamente o contêiner.
center_horizontal Coloca o objeto no centro horizontal do contêiner sem mudar o tamanho.
fill_horizontal Aumenta o tamanho horizontal do objeto, se necessário, para que ele preencha completamente o contêiner.
center Coloca o objeto no centro do contêiner, nos eixos vertical e horizontal, sem mudar o tamanho.
fill Aumenta o tamanho horizontal e vertical do objeto, se necessário, para que ele preencha completamente o contêiner.
clip_vertical Outra opção que pode ser definida para que as bordas de cima e/ou de baixo do filho sejam recortadas nos limites do contêiner. O recorte se baseia na gravidade vertical: uma gravidade no topo recorta a borda de baixo, uma gravidade na parte de baixo recorta a borda de cima e nenhuma gravidade recorta as duas bordas.
clip_horizontal Outra opção para definir se as bordas esquerda e/ou direita do filho vão ser recortadas nos limites do contêiner. O recorte se baseia na gravidade horizontal: uma gravidade à esquerda recorta a borda direita, uma gravidade à direita recorta a borda esquerda e nenhuma gravidade recorta as duas bordas.
android:scaleHeight
Porcentagem. A altura da escala, definida como uma porcentagem do limite do drawable. O formato do valor é XX%. Por exemplo: 100%, 12,5% etc.
android:scaleWidth
Porcentagem. A largura da escala, definida como uma porcentagem do limite do drawable. O formato do valor é XX%. Por exemplo: 100%, 12,5%, etc.
Exemplo:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/logo"
    android:scaleGravity="center_vertical|center_horizontal"
    android:scaleHeight="80%"
    android:scaleWidth="80%" />
confira também:

Drawable de formato

É um formato genérico definido no XML.

localização do arquivo:
res/drawable/filename.xml
O nome do arquivo é usado como ID de recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um GradientDrawable.
referência de recurso:
Em Java: R.drawable.filename
Em XML: @[package:]drawable/filename
sintaxe:
<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape=["rectangle" | "oval" | "line" | "ring"] >
    <corners
        android:radius="integer"
        android:topLeftRadius="integer"
        android:topRightRadius="integer"
        android:bottomLeftRadius="integer"
        android:bottomRightRadius="integer" />
    <gradient
        android:angle="integer"
        android:centerX="float"
        android:centerY="float"
        android:centerColor="integer"
        android:endColor="color"
        android:gradientRadius="integer"
        android:startColor="color"
        android:type=["linear" | "radial" | "sweep"]
        android:useLevel=["true" | "false"] />
    <padding
        android:left="integer"
        android:top="integer"
        android:right="integer"
        android:bottom="integer" />
    <size
        android:width="integer"
        android:height="integer" />
    <solid
        android:color="color" />
    <stroke
        android:width="integer"
        android:color="color"
        android:dashWidth="integer"
        android:dashGap="integer" />
</shape>
elementos:
<shape>
O drawable de formato. Precisa ser o elemento raiz.

atributos:

xmlns:android
String. Obrigatório. Define o namespace XML, que precisa ser "http://schemas.android.com/apk/res/android".
android:shape
Palavra-chave. Define o tipo de formato. Os valores válidos são:
ValorDescrição
"rectangle" Um retângulo que preenche a visualização que o contém. É o formato padrão.
"oval" Formato oval que se encaixa nas dimensões da visualização que o contém.
"line" Linha horizontal da largura da visualização que a contém. Esse formato exige o elemento <stroke> para definir a largura da linha.
"ring" Forma circular.

Os atributos abaixo são usados apenas quando android:shape="ring":

android:innerRadius
Dimensão. O raio da parte interna do círculo (o buraco no centro), como um valor de dimensão ou um recurso de dimensão.
android:innerRadiusRatio
Ponto flutuante. O raio da parte interna do círculo, expresso como uma relação da largura do círculo. Por exemplo, se for android:innerRadiusRatio="5", o raio interno vai ser igual à largura do círculo dividida por 5. Esse valor é substituído por android:innerRadius. O valor padrão é 9.
android:thickness
Dimensão. A espessura do círculo, como um valor de dimensão ou recurso de dimensão.
android:thicknessRatio
Ponto flutuante. A espessura do círculo definida como uma relação da largura do círculo. Por exemplo, se for android:thicknessRatio="2", a espessura vai ser igual à largura do círculo dividida por 2. Esse valor é substituído por android:innerRadius. O valor padrão é 3.
android:useLevel
Booleano. É definido como "true" se for usado como LevelListDrawable. Normalmente, ele deve ser "false", caso contrário, o formato pode não aparecer.
<corners>
Cria cantos arredondados para a forma. É aplicado apenas quando a forma é um retângulo.

atributos:

android:radius
Dimensão. O raio para todos os cantos, como um valor de dimensão ou recurso de dimensão. É substituído para cada canto pelos atributos abaixo.
android:topLeftRadius
Dimensão. O raio para o canto esquerdo de cima, como um valor de dimensão ou recurso de dimensão.
android:topRightRadius
Dimensão. O raio para o canto direito de cima, como um valor de dimensão ou recurso de dimensão.
android:bottomLeftRadius
Dimensão. O raio para o canto esquerdo de baixo, como um valor de dimensão ou recurso de dimensão.
android:bottomRightRadius
Dimensão. O raio para o canto direito de baixo, como um valor de dimensão ou recurso de dimensão.

Observação: para todos os cantos, é necessário fornecer inicialmente um raio maior do que 1, senão nenhum deles vai ser arredondado. Se você quiser especificar cantos não arredondados, uma alternativa é usar android:radius para definir um raio padrão de canto maior do que 1 e substituir cada um deles com os valores que realmente quer, indicando zero ("0dp") onde não quiser cantos arredondados.

<gradient>
Especifica uma cor de gradiente para o formato.

atributos:

android:angle
Número inteiro. O ângulo do gradiente em graus. 0 é da esquerda para a direita, 90 é de baixo para cima. Precisa ser um múltiplo de 45. O padrão é 0.
android:centerX
Ponto flutuante. A posição X relativa do centro do gradiente (0 - 1,0).
android:centerY
Ponto flutuante. A posição Y relativa do centro do gradiente (0 - 1,0).
android:centerColor
Cor. Cor opcional entre as cores inicial e final, como um valor hexadecimal ou recurso de cor.
android:endColor
Cor. A cor final, como um valor hexadecimal ou recurso de cor.
android:gradientRadius
Ponto flutuante. O raio do gradiente. Aplicado somente quando android:type="radial".
android:startColor
Cor. A cor inicial, como um valor hexadecimal ou recurso de cor.
android:type
Palavra-chave. O tipo de padrão de gradiente a ser aplicado. Os valores válidos são:
ValorDescrição
"linear" Um gradiente linear. Esse é o padrão.
"radial" Um gradiente radial. A cor inicial é a cor do centro.
"sweep" Um gradiente de linha de varredura.
android:useLevel
Booleano. É definido como "true" se for usado como um LevelListDrawable.
<padding>
Padding a ser aplicado ao elemento de visualização que o contém (preenche a posição do conteúdo da visualização, não o formato).

atributos:

android:left
Dimensão. Padding esquerdo, como um valor de dimensão ou recurso de dimensão.
android:top
Dimensão. Padding de cima, como um valor de dimensão ou recurso de dimensão.
android:right
Dimensão. Padding direito, como um valor de dimensão ou recurso de dimensão.
android:bottom
Dimensão. Padding de baixo, como um valor de dimensão ou recurso de dimensão.
<size>
O tamanho do formato.

atributos:

android:height
Dimensão. A altura do formato, como um valor de dimensão ou recurso de dimensão.
android:width
Dimensão. A largura do formato, como um valor de dimensão ou recurso de dimensão.

Observação: por padrão, o formato é redimensionado para o tamanho da visualização que o contém proporcionalmente às dimensões definidas aqui. Ao usar o formato em uma ImageView, você pode restringir o redimensionamento definindo o android:scaleType como "center".

<solid>
Uma cor sólida para preencher o formato.

atributos:

android:color
Cor. A cor a ser aplicada à forma, como um valor hexadecimal ou recurso de cor.
<stroke>
Uma linha de traço para o formato.

atributos:

android:width
Dimensão. A espessura da linha, como um valor de dimensão ou recurso de dimensão.
android:color
Cor. A cor da linha, como um valor hexadecimal ou recurso de cor.
android:dashGap
Dimensão. A distância entre os traços da linha, como um valor de dimensão ou recurso de dimensão. Só é válida se android:dashWidth estiver definido.
android:dashWidth
Dimensão. O tamanho de cada linha de traço, como um valor de dimensão ou recurso de dimensão. Só é válida se android:dashGap estiver definido.
Exemplo:
Arquivo XML salvo em res/drawable/gradient_box.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#FFFF0000"
        android:endColor="#80FF00FF"
        android:angle="45"/>
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners android:radius="8dp" />
</shape>

Esse layout XML aplica o drawable de formato a uma visualização:

<TextView
    android:background="@drawable/gradient_box"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />

Este código de aplicativo obtém o drawable de formato e o aplica a uma visualização:

Kotlin

val shape: Drawable? = getDrawable(resources, R.drawable.gradient_box, getTheme())

val tv: TextView = findViewById(R.id.textview)
tv.background = shape

Java

Resources res = getResources();
Drawable shape = ResourcesCompat.getDrawable(res, R.drawable.gradient_box, getTheme());

TextView tv = (TextView)findViewById(R.id.textview);
tv.setBackground(shape);
confira também: