Um recurso drawable é 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 drawables:
- Arquivo Bitmap
-
- É um arquivo gráfico de bitmaps (
.png
, .jpg
ou .gif
). Cria um BitmapDrawable
.
- Arquivo Nine-Patch
- É um 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
- É 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, a quem 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 drawable 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 drawable 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 drawable 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: 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 um stream de bits, em vez de convertê-la em um bitmap, coloque as imagens na pasta res/raw/
, onde não serão otimizadas.
Arquivo Bitmap
Os arquivos de bitmaps 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/
.
- local 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
:
Kotlin
val drawable: Drawable? = ResourcesCompat.getDrawable
(resources, R.drawable.myimage, null)
- veja 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 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 “|”):
Valor | Descriçã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 ver 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:
Valor | Descriçã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 em que é 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 é 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 esticar 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 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
- local 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 drawable que gerencia uma matriz de outros drawables. Cada drawable na lista é desenhado na ordem da lista — o último drawable da lista é desenhado no topo.
Cada drawable é 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 drawable para colocar na camada drawable em uma posição definida por seus atributos. Deve ser um filho de um elemento
<layer-list>
. 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 código. Esse identificador é útil para recuperar e modificar o drawable 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 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, 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
É um drawable que gerencia vários drawables alternativos, aos quais se atribuíram valores numéricos máximos. A definição do valor de nível do drawable com um setLevel()
carrega o recurso do drawable na lista de nível que tem um valor de android:maxLevel
maior ou igual ao valor passado pelo método.
- local 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:
-
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()
.
- local 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 código. Esse identificador é útil para recuperar e modificar o drawable 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:
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);
}
- veja 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
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:
-
Drawable de recorte
É um drawable definido em XML que recorta outro drawable com base no nível atual desse drawable. 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:
Valor | Descriçã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 “|”):
Valor | Descriçã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 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. Aqui está 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.
- veja também:
-
Drawable de escala
É um drawable definido em XML que muda o tamanho de outro drawable 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 “|”):
Valor | Descriçã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:
-
Drawable 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:
Valor | Descriçã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:
Valor | Descriçã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 drawable de formato e aplica-o 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);
- veja também:
-