Recursos desenháveis

Um recurso desenhável é um conceito geral para um gráfico que pode ser desenhado na tela e que pode ser recuperado 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 desenháveis:

Arquivo Bitmap
Arquivo gráfico de mapa de bits (.png, .jpg ou .gif). Cria um BitmapDrawable.
Arquivo Nine-Patch
Arquivo PNG com regiões extensíveis para permitir o redimensionamento da imagem com base no conteúdo (.9.png). Cria um NinePatchDrawable.
Lista de camadas
Desenhável que gerencia uma matriz de outros desenháveis. Eles são desenhados na ordem da matriz, portanto, o elemento com o índice maior será desenhado no topo. Cria um LayerDrawable.
Lista de estados
Arquivo XML que referencia diferentes gráficos de mapa de bits para diversos estados (por exemplo, para usar uma imagem diferente quando um botão é pressionado). Cria um StateListDrawable.
Lista de níveis
Arquivo XML que define um desenhável que gerencia vários desenháveis alternativos, a quem foram atribuídos valores numéricos máximos. Cria um LevelListDrawable.
Desenhável de transição
Arquivo XML que define um desenhável que pode fazer a transição cruzada entre dois recursos desenháveis. Cria um TransitionDrawable.
Desenhável de encarte
Arquivo XML que define um desenhável que envolve outro desenhável a uma distância especificada. É útil quando uma visualização precisa de um desenhável de fundo menor do que os limites atuais da visualização.
Desenhável de recorte
Arquivo XML que define um desenhável que recorta outro desenhável com base no valor de nível atual do desenhável. Cria um ClipDrawable.
Desenhável de escala
Arquivo XML que define um desenhável que muda o tamanho de outro desenhável com base no valor de nível atual. Cria um ScaleDrawable
Desenhável de formato
XML que define um formato geométrico, incluindo cores e gradientes. Cria um ShapeDrawable.

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

Observação: Recurso de cor também pode ser usado como um desenhável em XML. Por exemplo, ao criar um desenhável de lista de estados, é possível referenciar um recurso de cor para o atributo android:drawable (android:drawable="@color/green").

Bitmap

Imagem de mapa de bits. O Android é compatível com arquivos de mapa de bits em três formatos: .png (preferencial), .jpg (aceitável), .gif (não recomendado).

É possível referenciar um arquivo de mapa de bits 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 podem ser convertido em um PNG de 8 bits com uma paleta de cores. Isso resultará em uma imagem de qualidade igual, mas que exige menos memória. Portanto, esteja ciente de que os binários de imagem colocados nesse diretório podem mudar durante a compilação. Se você planeja ler uma imagem como uma sequência de bits, em vez de convertê-la em um mapa de bits, coloque as imagens na pasta res/raw/, onde não serão otimizadas.

Arquivo Bitmap

Arquivos de mapa de bits são arquivos .png, .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, .jpg ou .gif)
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um BitmapDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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 de aplicativo a seguir recupera a imagem como um Drawable:

Resources res = getResources();
Drawable drawable = res.getDrawable(R.drawable.myimage);
veja também:

Bitmap XML

O mapa de bits XML é um recurso definido no XML que aponta para um arquivo de mapa de bits. O efeito é um alias para um arquivo de mapa de bits bruto. O XML pode definir propriedades adicionais para o mapa de bits, 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 desenhável.

localização do arquivo:
res/drawable/filename.xml
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um BitmapDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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 mapa de bits e suas propriedades.

atributos:

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

Deve ser um ou mais dos seguintes valores constantes (separados por “|”):

ValorDescrição
top Coloca o objeto no topo do recipiente sem lhe alterar o tamanho.
bottom Coloca o objeto na parte inferior do recipiente sem lhe alterar o tamanho.
left Coloca o objeto na borda esquerda do recipiente sem lhe alterar o tamanho.
right Coloca o objeto na borda direita do recipiente sem lhe alterar o tamanho.
center_vertical Coloca o objeto no centro vertical de seu recipiente sem lhe alterar o tamanho.
fill_vertical Aumenta o tamanho vertical do objeto, se necessário, para que ele preencha completamente o recipiente.
center_horizontal Coloca o objeto no centro horizontal do recipiente sem lhe alterar o tamanho.
fill_horizontal Aumenta o tamanho horizontal do objeto, se necessário, para que ele preencha completamente o recipiente.
center Coloca o objeto no centro do recipiente, nos eixos vertical e horizontal, sem lhe alterar o tamanho.
fill Aumenta o tamanho horizontal e vertical do objeto, se necessário, para que ele preencha completamente o recipiente. Esse é o padrão.
clip_vertical Opção adicional que pode ser definida para que as bordas superior e/ou inferior do filho sejam recortadas nos limites do recipiente. O recorte se baseia na gravidade vertical: uma gravidade no topo recorta a borda inferior, uma gravidade na parte inferior recorta a borda superior e nenhuma gravidade recorta as duas bordas.
clip_horizontal Opção adicional para definir se as bordas esquerda e/ou direita do filho serão recortadas nos limites do recipiente. 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 obter mais informações. O valor padrão é false.
android:tileMode
Palavra-chave. Define o modo agrupado. Quando o modo agrupado está ativado, o mapa de bits é repetido. A gravidade é ignorada quando o modo agrupado está ativado.

Deve ser um dos seguintes valores constantes:

ValorDescrição
disabled Não agrupa o mapa de bits. É o valor padrão.
clamp Replica a cor da borda se o sombreador desenhar 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" />
veja também:

Nine-Patch

NinePatch é uma imagem PNG na qual é possível definir regiões esticáveis que o Android dimensiona quando o conteúdo dentro da visualização excede os limites normais da imagem. Normalmente, atribui-se esse tipo de imagem como segundo plano de uma visualização que tenha pelo menos uma dimensão configurada como "wrap_content" e, 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 deve se esticar para acomodar o texto (ou a imagem) dentro do botão.

Da mesma forma que com um mapa de bits normal, é possível referenciar um arquivo Nine-Patch diretamente ou em um recurso definido pelo XML.

Para ver uma discussão completa sobre como criar um arquivo Nine-Patch com regiões esticáveis, consulte o documento Gráficos 2D.

Arquivo Nine-Patch

localização do arquivo:
res/drawable/filename.9.png
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um NinePatchDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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" />
veja também:

XML Nine-Patch

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
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um NinePatchDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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 suas propriedades.

atributos:

xmlns:android
String. Obrigatório. Define o namespace do XML, que deve ser "http://schemas.android.com/apk/res/android".
android:src
Recurso desenhável. Obrigatório. Referência a um arquivo Nine-Patch.
android:dither
Booleano. Ativa ou desativa o pontilhamento do mapa de bits se ele não tiver a mesma configuração de pixels que a tela (por exemplo, um mapa de bits 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 desenhável que gerencia uma matriz de outros desenháveis. Cada desenhável na lista é desenhado na ordem da lista — o último desenhável da lista é desenhado no topo.

Cada desenhável é representado por um elemento <item> dentro de um único elemento <layer-list>.

localização do arquivo:
res/drawable/filename.xml
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um LayerDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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. Deve ser um elemento raiz. Contém um ou mais elementos <item>.

atributos:

xmlns:android
String. Obrigatório. Define o namespace do XML, que deve ser "http://schemas.android.com/apk/res/android".
<item>
Define um desenhável para colocar na camada drawable em uma posição definida por seus atributos. Deve ser um filho de um elemento <selector>. Aceita elementos <bitmap> filhos.

atributos:

android:drawable
Recurso desenhável. Obrigatório. Referência a um recurso desenhável.
android:id
ID de recurso. ID de recurso único para esse desenhável. Para criar um novo ID de recurso para esse item, use o formulário: "@+id/name". O símbolo de mais indica que deve ser criado como um novo ID. Esse identificador é útil para recuperar e modificar o desenhável com View.findViewById() ou Activity.findViewById().
android:top
Número inteiro. O deslocamento superior em pixels.
android:right
Número inteiro. O deslocamento direito em pixels.
android:bottom
Número inteiro. O deslocamento inferior em pixels.
android:left
Número inteiro. O deslocamento esquerdo em pixels.

Por padrão, todos os itens desenháveis são redimensionados para corresponder ao tamanho da visualização que os contém. Portanto, colocar as imagens em uma lista de camadas em diferentes posições pode aumentar o tamanho da visualização e redimensionar algumas imagens da forma apropriada. Para evitar redimensionar os itens na lista, use um elemento <bitmap> dentro do elemento <item> para especificar o desenhável e definir a gravidade de algo que não se redimensiona, como "center". Por exemplo, o <item> a seguir 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 a seguir 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 desenhável para cada item com uma gravidade “center”. Isso garante que nenhuma das imagens seja redimensionada para corresponder ao tamanho do recipiente devido ao redimensionamento causado por imagens deslocadas.

Esse layout XML aplica o desenhável 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:

veja também:

Lista de estados

StateListDrawable é um objeto desenhável 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 desenhável de lista de estados, pode-se fornecer uma imagem de plano de fundo diferente para cada estado.

Você pode descrever a 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 deve ser usado como o gráfico do desenhável.

Durante cada mudança de estado, a lista de estados é percorrida debaixo para cima e o primeiro item que corresponde ao estado atual é usado — a seleção não é baseada na “melhor correspondência”, mas simplesmente no primeiro item que atende ao critério mínimo do estado.

localização do arquivo:
res/drawable/filename.xml
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um StateListDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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. Deve ser um elemento raiz. Contém um ou mais elementos <item>.

atributos:

xmlns:android
String. Obrigatório. Define o namespace do XML, que deve ser "http://schemas.android.com/apk/res/android".
android:constantSize
Booleano. “true” se o tamanho interno informado do desenhável permanece constante à medida que o estado muda (o tamanho é o máximo de todos os estados); “false” se o tamanho varia com base no estado atual. O padrão é false.
android:dither
Booleano. “true” para ativar o pontilhamento do mapa de bits se ele não tiver a mesma configuração de pixels que a tela (por exemplo, um mapa de bits ARGB 8888 com uma tela RGB 565); “false” para desativar o pontilhamento. O padrão é true.
android:variablePadding
Booleano. “true” se o pontilhamento do desenhável tiver que mudar com base no estado atual selecionado; “false” se o pontilhamento tiver que permanecer o mesmo (com base no pontilhamento 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 padrão é false.
<item>
Define um desenhável para usar durante certos estados, como descrito por seus atributos. Deve ser um filho de um elemento <selector>.

atributos:

android:drawable
Recurso desenhável. Obrigatório. Referência a um recurso desenhável.
android:state_pressed
Booleano. “true” se for necessário usar esse item quando o objeto é pressionado (como ao tocar/clicar em um botão); “false” se for necessário usar esse item no estado padrão não pressionado.
android:state_focused
Booleano. “true” se for necessário usar esse item quando o objeto tem foco de entrada (como quando o usuário seleciona uma entrada de texto); “false” se for necessário usar esse item no estado padrão sem foco.
android:state_hovered
Boolean. “true” se for necessário usar esse item com o cursor passando sobre o objeto; “false” se for necessário usar esse item no estado padrão sem cursor flutuante sobre ele. Com frequência, esse desenhável pode ser o mesmo usado para o estado “com foco”.

Introduzido na API de nível 14.

android:state_selected
Booleano. “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 d-pad); “false” se for necessário usar esse item quando o objeto não está selecionado.

O estado selecionado é usado quando o foco (android:state_focused) não é suficiente (como quando a visualização de lista tem foco e um item dentro dela é selecionado com um d-pad).

android:state_checkable
Booleano. “true” se for necessário usar esse item deve ser usado quando o objeto pode ser selecionado; “false” se for necessário usar esse item quando o objeto não pode ser selecionado. (Útil apenas se o objeto pode fazer a transição entre um widget selecionável e não selecionável.)
android:state_checked
Booleano. “true” se for necessário usar esse item quando o objeto está selecionado; “false” se for necessário usar esse item quando o objeto não está selecionado.
android:state_enabled
Booleano. “true” se for necessário usar esse item quando o objeto está ativado (capaz de receber eventos de toque/clique); “false” se deve ser usado quando o objeto está desativado.
android:state_activated
Booleano. “true” se for necessário usar esse item quando o objeto é ativado como a seleção persistente (como para "destacar" o item de lista selecionado anteriormente em uma visualização de navegação persistente); “false” quando o objeto não está ativado.

Introduzido na API de nível 11.

android:state_window_focused
Booleano. “true” se esse item deve ser usado quando a janela do aplicativo tem foco (o aplicativo está em primeiro plano), “false” quando a janela do aplicativo não tem foco (por exemplo, se a aba de notificações está puxada para baixo ou uma caixa de diálogo é exibida).

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

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 desenhável de lista de estados a um botão:

<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/button" />
veja também:

Lista de níveis

Desenhável que gerencia vários desenháveis alternativos, aos quais se atribuíram valores numéricos máximos. A definição do valor de nível do desenhável com um setLevel() carrega o recurso do desenhável na lista de nível que tem um valor de android:maxLevel maior ou igual ao valor passado pelo método.

localização do arquivo:
res/drawable/filename.xml
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um LevelListDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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>
Deve ser um elemento raiz. Contém um ou mais elementos <item>.

atributos:

xmlns:android
String. Obrigatório. Define o namespace do XML, que deve ser "http://schemas.android.com/apk/res/android".
<item>
Define um desenhável a usar em determinado nível.

atributos:

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

veja também:

Desenhável de transição

TransitionDrawable é um objeto desenhável que pode fazer a transição entre dois recursos desenháveis.

Cada desenhável é 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
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um TransitionDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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. Deve ser um elemento raiz. Contém um ou mais elementos <item>.

atributos:

xmlns:android
String. Obrigatório. Define o namespace do XML, que deve ser "http://schemas.android.com/apk/res/android".
<item>
Define um desenhável a usar como parte da transição de desenháveis. Deve ser um filho de um elemento <transition>. Aceita elementos <bitmap> filhos.

atributos:

android:drawable
Recurso desenhável. Obrigatório. Referência a um recurso desenhável.
android:id
ID de recurso. ID de recurso único para esse desenhável. Para criar um novo ID de recurso para esse item, use o formulário: "@+id/name". O símbolo de mais indica que deve ser criado como um novo ID. Esse identificador é útil para recuperar e modificar o desenhável com View.findViewById() ou Activity.findViewById().
android:top
Número inteiro. O deslocamento superior em pixels.
android:right
Número inteiro. O deslocamento direito em pixels.
android:bottom
Número inteiro. O deslocamento inferior 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 desenhável a uma visualização:

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

E o código a seguir executa uma transição de 500 ms do primeiro item para o segundo:

ImageButton button = (ImageButton) findViewById(R.id.button);
TransitionDrawable drawable = (TransitionDrawable) button.getDrawable();
drawable.startTransition(500);
veja também:

Desenhável de encarte

Desenhável definido em XML que faz o encarte de outro desenhável 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
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um InsetDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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 desenhável de encarte. Deve ser um elemento raiz.

atributos:

xmlns:android
String. Obrigatório. Define o namespace do XML, que deve ser "http://schemas.android.com/apk/res/android".
android:drawable
Recurso desenhável. Obrigatório. Referência a um recurso desenhável a ser encartado.
android:insetTop
Dimensão. Encarte superior, 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 inferior, 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" />
veja também:

Desenhável de recorte

Desenhável definido em XML que recorta outro desenhável com base no nível atual desse desenhável. Pode-se controlar o quanto o desenhável filho é recortado em largura e altura com base no nível, bem como uma gravidade para controlar onde ele é posicionado no recipiente geral. Usado com mais frequência para implementar coisas como barras de andamento.

localização do arquivo:
res/drawable/filename.xml
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um ClipDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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 desenhável de recorte. Deve ser um elemento raiz.

atributos:

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

Deve ser um dos seguintes valores constantes:

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

Deve ser um ou mais dos seguintes valores constantes (separados por “|”):

ValorDescrição
top Coloca o objeto no topo do recipiente sem lhe alterar o tamanho. Quando clipOrientation é "vertical", o recorte ocorre na parte inferior do desenhável.
bottom Coloca o objeto na parte inferior do recipiente sem lhe alterar o tamanho. Quando clipOrientation é "vertical", o recorte ocorre na parte superior do desenhável.
left Coloca o objeto na borda esquerda do recipiente sem lhe alterar o tamanho. Esse é o padrão. Quando clipOrientation é "horizontal", o recorte ocorre no lado direito do desenhável. Esse é o padrão.
right Coloca o objeto na borda direita do recipiente sem lhe alterar o tamanho. Quando clipOrientation é "horizontal", o recorte ocorre no lado esquerdo do desenhável.
center_vertical Coloca o objeto no centro vertical de seu recipiente sem lhe 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 desenhável enche o espaço vertical (a não ser que o nível do desenhável seja 0, quando não está visível).
center_horizontal Coloca o objeto no centro horizontal do recipiente sem lhe 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 desenhável enche o espaço horizontal (a não ser que o nível do desenhável seja 0, quando não está visível).
center Coloca o objeto no centro do recipiente, nos eixos vertical e horizontal, sem lhe alterar 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 recipiente. Não ocorre nenhum recorte porque o desenhável enche o espaço horizontal e vertical (a não ser que o nível do desenhável seja 0, quando não está visível).
clip_vertical Opção adicional que pode ser definida para que as bordas superior e/ou inferior do filho sejam recortadas nos limites do recipiente. O recorte se baseia na gravidade vertical: uma gravidade no topo recorta a borda inferior, uma gravidade na parte inferior recorta a borda superior e nenhuma gravidade recorta as duas bordas.
clip_horizontal Opção adicional para definir se as bordas esquerda e/ou direita do filho serão recortadas nos limites do recipiente. 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 a seguir aplica o desenhável de recorte a uma visualização:

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

O código a seguir obtém o desenhável e aumenta a quantidade de recorte para revelar progressivamente a imagem:

ImageView imageview = (ImageView) findViewById(R.id.image);
ClipDrawable drawable = (ClipDrawable) imageview.getDrawable();
drawable.setLevel(drawable.getLevel() + 1000);

Aumentar o nível reduz a quantidade de recorte e revela lentamente a imagem. Aqui está em um nível de 7000:

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.

veja também:

Desenhável de escala

Desenhável definido em XML que muda o tamanho de outro desenhável com base em seu nível atual.

localização do arquivo:
res/drawable/filename.xml
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um ScaleDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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 desenhável de escala. Deve ser um elemento raiz.

atributos:

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

Deve ser um ou mais dos seguintes valores constantes (separados por “|”):

ValorDescrição
top Coloca o objeto no topo do recipiente sem lhe alterar o tamanho.
bottom Coloca o objeto na parte inferior do recipiente sem lhe alterar o tamanho.
left Coloca o objeto na borda esquerda do recipiente sem lhe alterar o tamanho. Esse é o padrão.
right Coloca o objeto na borda direita do recipiente sem lhe alterar o tamanho.
center_vertical Coloca o objeto no centro vertical de seu recipiente sem lhe alterar o tamanho.
fill_vertical Aumenta o tamanho vertical do objeto, se necessário, para que ele preencha completamente o recipiente.
center_horizontal Coloca o objeto no centro horizontal do recipiente sem lhe alterar o tamanho.
fill_horizontal Aumenta o tamanho horizontal do objeto, se necessário, para que ele preencha completamente o recipiente.
center Coloca o objeto no centro do recipiente, nos eixos vertical e horizontal, sem lhe alterar o tamanho.
fill Aumenta o tamanho horizontal e vertical do objeto, se necessário, para que ele preencha completamente o recipiente.
clip_vertical Opção adicional que pode ser definida para que as bordas superior e/ou inferior do filho sejam recortadas nos limites do recipiente. O recorte se baseia na gravidade vertical: uma gravidade no topo recorta a borda inferior, uma gravidade na parte inferior recorta a borda superior e nenhuma gravidade recorta as duas bordas.
clip_horizontal Opção adicional para definir se as bordas esquerda e/ou direita do filho serão recortadas nos limites do recipiente. 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
Percentual. A altura da escala expressa como uma porcentagem do limite do desenhável. O formato do valor é XX%. Por exemplo: 100%, 12,5% etc.
android:scaleWidth
Percentual. A largura da escala, expressa como uma porcentagem do limite do desenhável. 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%" />
veja também:

Desenhável de formato

É um formato genérico definido no XML.

localização do arquivo:
res/drawable/filename.xml
Usa-se o nome de arquivo como o ID do recurso.
tipo de dados do recurso compilado:
Ponteiro do recurso para um GradientDrawable.
referência do recurso:
No Java: R.drawable.filename
No 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 desenhável de formato. Deve ser um elemento raiz.

atributos:

xmlns:android
String. Obrigatório. Define o namespace do XML, que deve 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.

Usam-se os seguintes atributos 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 android:innerRadiusRatio="5", o raio interno é 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 expressa como uma relação da largura do círculo. Por exemplo: se android:thicknessRatio="2", a espessura é igual à largura do círculo dividida por 2. Esse valor é substituído por android:innerRadius. O valor padrão é 3.
android:useLevel
Booleano. “true” se for usado como um LevelListDrawable. Normalmente deve ser “false”, senão o formato poderá não aparecer.
<corners>
Cria cantos arredondados para o formato. Aplica-se somente quando o formato é 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 a seguir.
android:topLeftRadius
Dimensão. O raio para o canto superior esquerdo, como um valor de dimensão ou recurso de dimensão.
android:topRightRadius
Dimensão. O raio para o canto superior direito, como um valor de dimensão ou recurso de dimensão.
android:bottomLeftRadius
Dimensão. O raio para o canto inferior esquerdo, como um valor de dimensão ou recurso de dimensão.
android:bottomRightRadius
Dimensão. O raio para o canto inferior direito, como um valor de dimensão ou recurso de dimensão.

Observação: Para todos os cantos, deve-se fornecer (inicialmente) um raio de canto maior do que 1, senão nenhum canto é 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 dos cantos com os valores que realmente deseja, fornecendo 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 é debaixo para cima. Deve 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 aplicar. 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. “true” se for usado como um LevelListDrawable.
<padding>
Preenchimento 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. Preenchimento esquerdo, como um valor de dimensão ou recurso de dimensão.
android:top
Dimensão. Preenchimento superior, como um valor de dimensão ou recurso de dimensão.
android:right
Dimensão. Preenchimento direito, como um valor de dimensão ou recurso de dimensão.
android:bottom
Dimensão. Preenchimento inferior, 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 redimensiona 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 aplicar ao formato, 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 está definida.
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 está definida.
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 desenhável 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 desenhável de formato e aplica-o a uma visualização:

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

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