Stay organized with collections
Save and categorize content based on your preferences.
A drawable resource is a general concept for a graphic that can be drawn to the screen and that
you can retrieve with APIs such as getDrawable(int) or apply
to another XML resource with attributes such as android:drawable and android:icon.
There are several types of drawables:
A drawable that manages an array of other drawables. These are drawn in array order, so the
element with the largest index is drawn on top. Creates a LayerDrawable.
An XML file that references different bitmap graphics
for different states—for example, to use a different image when a button is tapped.
Creates a StateListDrawable.
An XML file that defines a drawable that manages a number of alternate drawables, each
assigned a maximum numerical value. Creates a LevelListDrawable.
An XML file that defines a drawable that insets another drawable by a specified distance.
This is useful when a view needs a background drawable that is smaller than the view's actual
bounds.
Note: A color resource can also be
used as a drawable in XML. For example, when creating a state list
drawable, you can reference a color resource for the android:drawable attribute (android:drawable="@color/green").
Bitmap
A bitmap image. Android supports bitmap files in the following formats:
PNG (preferred), WEBP (preferred, requires API level 17 or higher), JPG (acceptable), GIF (discouraged).
You can reference a bitmap file directly, using the filename as the resource ID, or create an
alias resource ID in XML.
Note: Bitmap files might be automatically optimized with lossless
image compression by the aapt tool during the build process. For
example, a true-color PNG that doesn't require more than 256 colors might be converted to an 8-bit
PNG with a color palette. This results in an image of equal quality that requires less
memory.
So, be aware that the image binaries placed in this directory can change during the build. If
you plan to read an image as a bit stream to convert it to a bitmap, put your images in
the res/raw/ folder instead, where they aren't optimized.
Bitmap file
A bitmap file is a PNG, WEBP, JPG, or GIF file. Android creates a Drawable
resource for any of these files when you save them in the res/drawable/ directory.
file location:
res/drawable/filename.png (.png, .webp, .jpg, or .gif)
The filename is the resource ID
An XML bitmap is a resource defined in XML that points to a bitmap file. The effect is an alias for a
raw bitmap file. The XML can specify additional properties for the bitmap, such as dithering and tiling.
Note: You can use a element as a child of
an element. For
example, when creating a state list or layer list,
you can exclude the android:drawable
attribute from an element and nest a inside it
that defines the drawable item.
file location:
res/drawable/filename.xml
The filename is the resource ID
Required. Defines the bitmap source and its properties.
Attributes:
xmlns:android
String. Defines the XML namespace, which must be
"http://schemas.android.com/apk/res/android". This is required only if the
is the root element. It isn't needed when the
is nested inside an .
android:src
Drawable resource. Required. Reference to a drawable
resource.
android:antialias
Boolean. Enables or disables antialiasing.
android:dither
Boolean. Enables or disables dithering of the bitmap if the bitmap doesn't
have the same pixel configuration as the screen, such as an ARGB 8888 bitmap on an RGB 565
screen.
android:filter
Boolean. Enables or disables bitmap filtering. Filtering is used when the
bitmap is shrunk or stretched to smooth its appearance.
android:gravity
Keyword. Defines the gravity for the bitmap. The gravity indicates where to
position the drawable in its container if the bitmap is smaller than the container.
Must be one or more of the following constant values, separated by |:
Value
Description
top
Put the object at the top of its container, not changing its size.
bottom
Put the object at the bottom of its container, not changing its size.
left
Put the object at the left edge of its container, not changing its size.
right
Put the object at the right edge of its container, not changing its size.
center_vertical
Put the object in the vertical center of its container, not changing its size.
fill_vertical
Grow the vertical size of the object if needed so it completely fills its container.
center_horizontal
Place object in the horizontal center of its container, not changing its size.
fill_horizontal
Grow the horizontal size of the object if needed so it completely fills its container.
center
Put the object in the center of its container in both the vertical and horizontal axis, not
changing its size.
fill
Grow the horizontal and vertical size of the object if needed so it completely fills its
container. This is the default.
clip_vertical
Additional option that can be set to have the top and/or bottom edges of the child clipped to
its container's bounds. The clip is based on the vertical gravity: a top gravity clips the
bottom edge, a bottom gravity clips the top edge, and neither clips both edges.
clip_horizontal
Additional option that can be set to have the left and/or right edges of the child clipped to
its container's bounds. The clip is based on the horizontal gravity: a left gravity clips
the right edge, a right gravity clips the left edge, and neither clips both edges.
android:mipMap
Boolean. Enables or disables the mipmap hint. See setHasMipMap() for more information.
The default value is false.
android:tileMode
Keyword. Defines the tile mode. When the tile mode is enabled, the bitmap is
repeated. Gravity is ignored when the tile mode is enabled.
Must be one of the following constant values:
Value
Description
disabled
Don't tile the bitmap. This is the default value.
clamp
Replicate the edge color if the shader draws outside its original bounds
repeat
Repeat the shader's image horizontally and vertically.
mirror
Repeat the shader's image horizontally and vertically, alternating mirror images so that
adjacent images always seam.
A NinePatch is a PNG image in which you can define stretchable regions
that Android scales when content within the view exceeds the normal image bounds. You
typically assign this type of image as the background of a view that has at least one dimension set
to "wrap_content".
When the view grows to accommodate the content, the nine-patch image
is also scaled to match the size of the view. An example use of a nine-patch image is the
background used by Android's standard Button widget, which must stretch to
accommodate the text (or image) inside the button.
As with a normal bitmap, you can reference a nine-patch file directly
or from a resource defined by XML.
Required. Defines the nine-patch source and its properties.
Attributes:
xmlns:android
String. Required. Defines the XML namespace, which must be
"http://schemas.android.com/apk/res/android".
android:src
Drawable resource. Required. Reference to a nine-patch
file.
android:dither
Boolean. Enables or disables dithering of the bitmap if the bitmap doesn't
have the same pixel configuration as the screen, such as an ARGB 8888 bitmap on an RGB 565
screen.
A LayerDrawable is a drawable object
that manages an array of other drawables. Each drawable in the list is drawn in the order of the
list. The last drawable in the list is drawn on top.
Each drawable is represented by an element inside a single element.
file location:
res/drawable/filename.xml
The filename is the resource ID
Required. This must be the root element. Contains one or more elements.
Attributes:
xmlns:android
String. Required. Defines the XML namespace, which must be
"http://schemas.android.com/apk/res/android".
Defines a drawable to place in the layer drawable, in a position defined by its attributes.
Must be a child of a element. Accepts child
elements.
Attributes:
android:drawable
Drawable resource. Required. Reference to a drawable
resource.
android:id
Resource ID. A unique resource ID for this drawable. To create a new resource
ID for this item, use the form:
"@+id/name". The plus symbol indicates that this is created as a new
ID. You can use this identifier to
retrieve and modify the drawable with View.findViewById() or Activity.findViewById().
All drawable items are scaled to fit the size of the containing view, by default. Thus,
placing your images in a layer list at different positions might increase the size of the view, and
some images scale as appropriate.
To avoid
scaling items in the list, use a element inside the element to specify the drawable and define the gravity to something that doesn't
scale, such as "center". For example, the following defines an item
that scales to fit its container view:
android:drawable="@drawable/image"/>
To avoid scaling, the following example uses a element with centered
gravity:
This example uses a nested element to define the drawable
resource for each item with a "center" gravity. This ensures that none of the images are scaled to
fit the size of the container, due to resizing caused by the offset images.
A StateListDrawable is a drawable object defined in XML
that uses multiple images to represent the same graphic, depending on the state of
the object. For example, the state of a Button widget can be tapped, focused,
or neither; using a state list drawable, you can provide a different background image for each
state.
You describe the state list in an XML file. Each graphic is represented by an element inside a single element. Each
uses various attributes to describe the state in which it is used as the graphic for the
drawable.
During each state change, the state list is traversed top to bottom, and the first item that
matches the current state is used. The selection is not based on the "best
match," but rather the first item that meets the minimum criteria of the state.
file location:
res/drawable/filename.xml
The filename is the resource ID
Required. This must be the root element. Contains one or more elements.
Attributes:
xmlns:android
String. Required. Defines the XML namespace, which must be
"http://schemas.android.com/apk/res/android".
android:constantSize
Boolean. True if the drawable's reported internal size remains constant as the state
changes (the size is the maximum of all of the states); false if the size varies based on
the current state. The default is false.
android:dither
Boolean. True to enable dithering of the bitmap if the bitmap doesn't have the same pixel
configuration as the screen, such as an ARGB 8888 bitmap on an RGB 565 screen; false to
disable dithering. The default is true.
android:variablePadding
Boolean. True if the drawable's padding changes based on the current
state that is selected; false if the padding must stay the same, based on the maximum
padding of all the states. Enabling this feature requires that you deal with
performing layout when the state changes, which is often not supported. The default is false.
Defines a drawable to use during certain states, as described by its attributes. Must be a
child of a element.
Attributes:
android:drawable
Drawable resource. Required. Reference to a drawable resource.
android:state_pressed
Boolean. True if this item is used when the object is tapped, such as when a button
is touched; false if this item is used in the default, non-tapped state.
android:state_focused
Boolean. True if this item is used when the object has input focus,
such as when the user selects a text input; false if this item is used in the default,
non-focused state.
android:state_hovered
Boolean. True if this item is used when the cursor hovers over the object;
false if this item is used in the default, non-hovered state. Often, this
drawable can be the same drawable used for the "focused" state.
Introduced in API level 14.
android:state_selected
Boolean. True if this item is used when the object is the current
user selection when navigating with a directional control, such as when navigating through a list
with a D-pad; false if this item is used when the object isn't selected.
The selected state is used when android:state_focused isn't sufficient,
such as when the list view has focus and an item within it is selected with a D-pad.
android:state_checkable
Boolean. True if this item is used when the object is selectable; false if this
item is used when the object isn't selectable. Only useful if the object can
transition between a selectable and non-selectable widget.
android:state_checked
Boolean. True if this item is used when the object is selected; false if it
is used when the object is un-selected.
android:state_enabled
Boolean. True if this item is used when the object is enabled,
meaning capable of receiving touch or click events; false if it is used when the object is
disabled.
android:state_activated
Boolean. True if this item is used when the object is activated as
the persistent selection, such as to "highlight" the previously selected list item in a persistent
navigation view; false if it is used when the object isn't activated.
Introduced in API level 11.
android:state_window_focused
Boolean. True if this item is used when the application window has focus, meaning the
application is in the foreground; false if this item is used when the application
window doesn't have focus, for example, if the notification shade is pulled down or a dialog appears.
Note: Android applies the first item in the state list that
matches the current state of the object. So, if the first item in the list contains
none of the preceding state attributes, then it is applied every time. This is why you want your
default value to always be last, as demonstrated in the following example.
A drawable that manages a number of alternate drawables, each assigned a maximum numerical
value. Setting the level value of the drawable with setLevel() loads the drawable resource in the
level list that has an android:maxLevel value greater than or equal to the value
passed to the method.
file location:
res/drawable/filename.xml
The filename is the resource ID
A TransitionDrawable is a drawable object
that can cross-fade between two other drawable resources.
Each drawable is represented by an element inside a single element. No more than two items are supported. To transition forward, call
startTransition(). To
transition backward, call reverseTransition().
file location:
res/drawable/filename.xml
The filename is the resource ID
Required. This must be the root element. Contains one or more elements.
Attributes:
xmlns:android
String. Required. Defines the XML namespace, which must be
"http://schemas.android.com/apk/res/android".
Defines a drawable to use as part of the drawable transition.
Must be a child of a element. Accepts child
elements.
Attributes:
android:drawable
Drawable resource. Required. Reference to a drawable
resource.
android:id
Resource ID. A unique resource ID for this drawable. To create a new resource
ID for this item, use the form:
"@+id/name". The plus symbol indicates that this is created as a new
ID. You can use this identifier to
retrieve and modify the drawable with View.findViewById() or Activity.findViewById().
A drawable defined in XML that insets another drawable by a specified distance. This is useful
when a view needs a background that is smaller than the view's actual bounds.
file location:
res/drawable/filename.xml
The filename is the resource ID
A drawable defined in XML that clips another drawable based on this drawable's current level. You
can control how much the child drawable gets clipped in width and height based on the level, as well
as a gravity to control where it is placed in its overall container. Most often used to implement
things like progress bars.
file location:
res/drawable/filename.xml
The filename is the resource ID
Required. Defines the clip drawable. This must be the root element.
Attributes:
xmlns:android
String. Required. Defines the XML namespace, which must be
"http://schemas.android.com/apk/res/android".
android:drawable
Drawable resource. Required. Reference to a drawable
resource to be clipped.
android:clipOrientation
Keyword. The orientation for the clip.
Must be one of the following constant values:
Value
Description
horizontal
Clip the drawable horizontally.
vertical
Clip the drawable vertically.
android:gravity
Keyword. Specifies where to clip within the drawable.
Must be one or more of the following constant values, separated by |:
Value
Description
top
Put the object at the top of its container, not changing its size. When clipOrientation is "vertical", clipping occurs at the bottom of the drawable.
bottom
Put the object at the bottom of its container, not changing its size. When clipOrientation is "vertical", clipping occurs at the top of the drawable.
left
Put the object at the left edge of its container, not changing its size. This is the
default. When clipOrientation is "horizontal", clipping occurs at the right side of
the drawable.
right
Put the object at the right edge of its container, not changing its size. When clipOrientation is "horizontal", clipping occurs at the left side of
the drawable.
center_vertical
Put the object in the vertical center of its container, not changing its size. Clipping behaves
the same as when gravity is "center".
fill_vertical
Grow the vertical size of the object if needed so it completely fills its container. When clipOrientation is "vertical", no clipping occurs because the drawable fills the
vertical space (unless the drawable level is 0, in which case it's not visible).
center_horizontal
Put the object in the horizontal center of its container, not changing its size.
Clipping behaves the same as when gravity is "center".
fill_horizontal
Grow the horizontal size of the object if needed so it completely fills its container. When
clipOrientation is "horizontal", no clipping occurs because the drawable fills the
horizontal space (unless the drawable level is 0, in which case it's not visible).
center
Put the object in the center of its container in both the vertical and horizontal axis, not
changing its size. When clipOrientation is "horizontal", clipping occurs on the left and right. When clipOrientation is "vertical", clipping occurs on the top and bottom.
fill
Grow the horizontal and vertical size of the object if needed so it completely fills its
container. No clipping occurs because the drawable fills the
horizontal and vertical space (unless the drawable level is 0, in which case it's not
visible).
clip_vertical
Additional option that can be set to have the top and/or bottom edges of the child clipped to
its container's bounds. The clip is based on the vertical gravity: a top gravity clips the
bottom edge, a bottom gravity clips the top edge, and neither clips both edges.
clip_horizontal
Additional option that can be set to have the left and/or right edges of the child clipped to
its container's bounds. The clip is based on the horizontal gravity: a left gravity clips
the right edge, a right gravity clips the left edge, and neither clips both edges.
Increasing the level reduces the amount of clipping and slowly reveals the image. Here it is
at a level of 7000:
Note: The default level is 0, which is fully clipped so the image
isn't visible. When the level is 10,000, the image isn't clipped and is completely visible.
Required. Defines the scale drawable. This must be the root element.
Attributes:
xmlns:android
String. Required. Defines the XML namespace, which must be
"http://schemas.android.com/apk/res/android".
android:drawable
Drawable resource. Required. Reference to a drawable
resource.
android:scaleGravity
Keyword. Specifies the gravity position after scaling.
Must be one or more of the following constant values, separated by |:
Value
Description
top
Put the object at the top of its container, not changing its size.
bottom
Put the object at the bottom of its container, not changing its size.
left
Put the object at the left edge of its container, not changing its size. This is the
default.
right
Put the object at the right edge of its container, not changing its size.
center_vertical
Put the object in the vertical center of its container, not changing its size.
fill_vertical
Grow the vertical size of the object if needed so it completely fills its container.
center_horizontal
Put the object in the horizontal center of its container, not changing its size.
fill_horizontal
Grow the horizontal size of the object if needed so it completely fills its container.
center
Put the object in the center of its container in both the vertical and horizontal axis, not
changing its size.
fill
Grow the horizontal and vertical size of the object if needed so it completely fills its
container.
clip_vertical
Additional option that can be set to have the top and/or bottom edges of the child clipped to
its container's bounds. The clip is based on the vertical gravity: a top gravity clips the
bottom edge, a bottom gravity clips the top edge, and neither clips both edges.
clip_horizontal
Additional option that can be set to have the left and/or right edges of the child clipped to
its container's bounds. The clip is based on the horizontal gravity: a left gravity clips
the right edge, a right gravity clips the left edge, and neither clips both edges.
android:scaleHeight
Percentage. The scale height, expressed as a percentage of the drawable's
bound. The value's format is XX%, such as 100% or 12.5%.
android:scaleWidth
Percentage. The scale width, expressed as a percentage of the drawable's
bound. The value's format is XX%, such as 100% or 12.5%.
Required. The shape drawable. This must be the root element.
Attributes:
xmlns:android
String. Required. Defines the XML namespace, which must be
"http://schemas.android.com/apk/res/android".
android:shape
Keyword. Defines the type of shape. Valid values are:
Value
Description
"rectangle"
A rectangle that fills the containing view. This is the default shape.
"oval"
An oval shape that fits the dimensions of the containing view.
"line"
A horizontal line that spans the width of the containing view. This
shape requires the element to define the width of the
line.
"ring"
A ring shape.
The following attributes are used only when android:shape="ring":
android:innerRadius
Dimension. The radius for the
inner part of the ring (the hole in the middle), as a dimension value or dimension resource.
android:innerRadiusRatio
Float. The radius for the inner
part of the ring, expressed as a ratio of the ring's width. For instance, if android:innerRadiusRatio="5", then the inner radius equals the ring's width divided by 5. This
value is overridden by android:innerRadius. The default value is 9.
android:thickness
Dimension. The thickness of the
ring, as a dimension value or dimension resource.
android:thicknessRatio
Float. The thickness of the ring
expressed as a ratio of the ring's width. For instance, if android:thicknessRatio="2", then
the thickness equals the ring's width divided by 2. This value is overridden by android:innerRadius. The default value is 3.
android:useLevel
Boolean. True if this is used as
a LevelListDrawable. This normally is false,
or else your shape might not appear.
Creates rounded corners for the shape. Applies only when the shape is a rectangle.
Attributes:
android:radius
Dimension. The radius for all corners, as a dimension value or dimension resource. This is overridden for each
corner by the following attributes.
android:topLeftRadius
Dimension. The radius for the top-left corner, as a dimension value or dimension resource.
android:topRightRadius
Dimension. The radius for the top-right corner, as a dimension value or dimension resource.
android:bottomLeftRadius
Dimension. The radius for the bottom-left corner, as a dimension value or dimension resource.
android:bottomRightRadius
Dimension. The radius for the bottom-right corner, as a dimension value or dimension resource.
Note: Every corner must initially be provided a corner
radius greater than 1, or else no corners are rounded. If you want specific corners
to not be rounded, a workaround is to use android:radius to set a default corner
radius greater than 1 and then override every corner with the values you really
want, providing 0 ("0dp") where you don't want rounded corners.
Specifies a gradient color for the shape.
Attributes:
android:angle
Integer. The angle for the gradient, in degrees. 0 is left to right, 90 is
bottom to top. It must be a multiple of 45. The default is 0.
android:centerX
Float. The relative X-position for the center of the gradient (0 - 1.0).
android:centerY
Float. The relative Y-position for the center of the gradient (0 - 1.0).
android:centerColor
Color. Optional color that comes between the start and end colors, as a
hexadecimal value or color resource.
android:endColor
Color. The ending color, as a hexadecimal
value or color resource.
android:gradientRadius
Float. The radius for the gradient. Only applied when android:type="radial".
android:startColor
Color. The starting color, as a hexadecimal
value or color resource.
android:type
Keyword. The type of gradient pattern to apply. Valid values are:
Value
Description
"linear"
A linear gradient. This is the default.
"radial"
A radial gradient. The start color is the center color.
Dimension. The height of the shape, as a dimension value or dimension resource.
android:width
Dimension. The width of the shape, as a dimension value or dimension resource.
Note: By default, the shape scales to the size of the container
view proportionate to the dimensions defined here. When you use the shape in an ImageView, you can restrict scaling by setting the android:scaleType to "center".
A solid color to fill the shape.
Attributes:
android:color
Color. The color to apply to the shape, as a hexadecimal
value or color resource.
A stroke line for the shape.
Attributes:
android:width
Dimension. The thickness of the line, as a dimension value or dimension resource.
android:color
Color. The color of the line, as a
hexadecimal value or color resource.
android:dashGap
Dimension. The distance between line dashes, as a dimension value or dimension resource. Only valid if android:dashWidth is set.
android:dashWidth
Dimension. The size of each dash line, as a dimension value or dimension resource. Only valid if android:dashGap is set.
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2025-02-10 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-02-10 UTC."],[],[]]