Tài nguyên có thể vẽ

Stay organized with collections Save and categorize content based on your preferences.

Tài nguyên có thể vẽ là một khái niệm chung dành cho đồ hoạ để chỉ một đối tượng có thể vẽ được trên màn hình, và bạn có thể truy xuất tài nguyên đó bằng các API như getDrawable(int), hoặc áp dụng cho một tài nguyên XML khác có các thuộc tính như android:drawableandroid:icon. Có nhiều loại đối tượng có thể vẽ khác nhau:

Tệp bitmap
Tệp đồ hoạ bitmap (.png, .webp, .jpg, hoặc .gif). Tạo một BitmapDrawable.
Tệp 9-Patch
Tệp PNG có các vùng có thể co giãn để cho phép đổi kích thước hình ảnh dựa trên nội dung (.9.png). Tạo NinePatchDrawable.
Danh sách lớp
Đối tượng có thể vẽ quản lý một loạt các đối tượng có thể vẽ khác. Các thành phần này được vẽ theo thứ tự mảng, vì vậy, phần tử có chỉ mục lớn nhất sẽ được vẽ ở trên cùng. Tạo LayerDrawable.
Danh sách trạng thái
Tệp XML tham chiếu đến nhiều đồ họa bitmap cho các trạng thái khác nhau (chẳng hạn dùng một hình ảnh khác khi nhấn một nút). Tạo StateListDrawable.
Danh sách cấp độ
Tệp XML xác định một đối tượng có thể vẽ quản lý một số đối tượng có thể vẽ thay thế, mỗi đối tượng có thể chỉ định một giá trị số tối đa. Tạo LevelListDrawable.
Chuyển đổi giữa các đối tượng có thể vẽ
Tệp XML xác định một tài nguyên có thể vẽ có thể chuyển đổi ở dạng mờ dần giữa hai tài nguyên có thể vẽ. Tạo TransitionDrawable.
Lồng ghép các đối tượng có thể vẽ
Tệp XML xác định một đối tượng vẽ được sẽ lồng ghép một đối tượng có thể vẽ khác theo khoảng cách đã chỉ định. Tính năng này rất hữu ích khi Chế độ xem cần vẽ được nền nhỏ hơn giới hạn thực tế của Chế độ xem.
Cắt bớt đối tượng có thể vẽ
Tệp XML xác định một đối tượng vẽ được sẽ cắt bớt một đối tượng có thể vẽ khác dựa trên giá trị cấp hiện tại của đối tượng có thể vẽ này. Tạo ClipDrawable.
Điều chỉnh tỷ lệ các đối tượng có thể vẽ
Tệp XML xác định một đối tượng có thể kéo và thay đổi kích thước của một tài nguyên vẽ được khác dựa trên giá trị cấp hiện tại của tệp đó. Tạo một ScaleDrawable
Hình dạng có thể vẽ
Tệp XML xác định một hình dạng hình học, bao gồm cả màu sắc và độ dốc. Tạo GradientDrawable.

Ngoài ra, vui lòng xem tài liệu Tài nguyên về ảnh động để biết cách tạo AnimationDrawable.

Lưu ý: Bạn cũng có thể dùng tài nguyên màu dưới dạng một đối tượng có thể vẽ trong XML. Ví dụ như khi tạo một danh sách trạng thái có thể vẽ, bạn có thể tham chiếu tài nguyên màu cho thuộc tính android:drawable (android:drawable="@color/green").

Bitmap

Hình ảnh bitmap. Android hỗ trợ tệp bitmap ở các định dạng sau: .png (ưu tiên), ,webp (ưu tiên, yêu cầu API cấp 17 trở lên), .jpg (có thể chấp nhận), .gif (không nên chọn).

Bạn có thể tham chiếu trực tiếp tệp bitmap, sử dụng tên tệp làm mã nhận dạng tài nguyên hoặc tạo một mã nhận dạng tài nguyên đại diện trong XML.

Lưu ý: Tệp Bitmap có thể được tối ưu hoá tự động với tính năng nén hình ảnh không bị suy hao bằng công cụ aapt trong quá trình xây dựng. Ví dụ như PNG có màu thực không yêu cầu nhiều hơn 256 màu có thể được chuyển đổi thành PNG 8 bit với bảng màu. Việc này sẽ dẫn đến hình ảnh có chất lượng như nhau nhưng yêu cầu ít bộ nhớ hơn. Vui lòng lưu ý là các tệp nhị phân hình ảnh được đặt trong thư mục này có thể thay đổi trong quá trình tạo. Nếu bạn định đọc hình ảnh dưới dạng một luồng bit để chuyển đổi hình ảnh đó thành bitmap, hãy đưa hình ảnh của bạn vào thư mục res/raw/ để không tối ưu hoá hình ảnh.

Tệp Bitmap

Tệp bitmap là tệp .png, .webp, .jpg hoặc .gif. Android tạo một tài nguyên Drawable cho mọi tệp trong số này khi bạn lưu những tệp đó vào thư mục res/drawable/.

vị trí tệp:
res/drawable/filename.png (.png, .webp, .jpg hoặc .gif)
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến BitmapDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
ví dụ:
Với một hình ảnh được lưu tại res/drawable/myimage.png, Tệp XML bố cục này sẽ áp dụng hình ảnh đó cho một Chế độ xem:
<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/myimage" />

Mã xử lý ứng dụng sau đây truy xuất hình ảnh dưới dạng Drawable:

Kotlin

val drawable: Drawable? = ResourcesCompat.getDrawable(resources, R.drawable.myimage, null)

Java

Resources res = getResources();
Drawable drawable = ResourcesCompat.getDrawable(res, R.drawable.myimage, null);
xem thêm:

XML bitmap

Bitmap XML là một tài nguyên được xác định trong XML trỏ đến tệp bitmap. Hiệu ứng này là một đại diện của tệp bitmap thô. XML có thể chỉ định các thuộc tính bổ sung cho bitmap, chẳng hạn như phối màu và xếp kề

Lưu ý: Bạn có thể sử dụng phần tử <bitmap> làm phần tử con của phần tử <item>. Ví dụ như khi tạo một danh sách trạng thái hoặc danh sách lớp, bạn có thể loại trừ thuộc tính android:drawable khỏi <item> và lồng một <bitmap> vào bên trong để xác định mục có thể vẽ được.

vị trí tệp:
res/drawable/filename.xml
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến BitmapDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
cú pháp:
<?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"] />
phần tử:
<bitmap>
Xác định nguồn bitmap và các thuộc tính của nguồn đó.

thuộc tính:

xmlns:android
Chuỗi. Xác định không gian tên XML phải là "http://schemas.android.com/apk/res/android". Điều này chỉ bắt buộc nếu <bitmap> là thành phần gốc - còn khi <bitmap> được lồng trong <item> thì bạn không cần phải xác định không gian tên theo yêu cầu.
android:src
Tài nguyên có thể vẽ. Bắt buộc. Tham chiếu đến một tài nguyên có thể vẽ.
android:antialias
Boolean. Bật hoặc tắt tính năng khử răng cưa.
android:dither
Boolean. Bật hoặc tắt tính năng phối màu của bitmap nếu bitmap không có cùng cấu hình pixel với màn hình (ví dụ như một bitmap ARGB 8888 với màn hình RGB 565).
android:filter
Boolean. Bật hoặc tắt tính năng lọc bitmap. Bộ lọc được sử dụng khi bitmap bị thu nhỏ hoặc kéo giãn để làm mượt hình ảnh của nó.
android:gravity
Từ khoá. Xác định trọng lực cho bitmap. Trọng lực cho biết vị trí đặt đối tượng có thể vẽ trong vùng chứa của đối tượng nếu bitmap nhỏ hơn vùng chứa.

Phải là một hoặc nhiều (được phân tách bằng dấu '|') các giá trị hằng số sau:

Giá trịMô tả
top Đặt đối tượng lên đầu vùng chứa, không thay đổi kích thước của đối tượng.
bottom Đặt đối tượng ở cuối vùng chứa, không thay đổi kích thước của đối tượng.
left Đặt đối tượng ở cạnh bên trái của vùng chứa, không thay đổi kích thước của đối tượng.
right Đặt đối tượng ở cạnh bên phải của vùng chứa, không thay đổi kích thước của đối tượng.
center_vertical Đặt đối tượng ở giữa vùng chứa theo chiều dọc, không thay đổi kích thước của đối tượng.
fill_vertical Tăng kích thước của đối tượng theo chiều dọc nếu cần để đối tượng lấp đầy hoàn toàn vùng chứa.
center_horizontal Đặt đối tượng ở giữa vùng chứa theo chiều ngang, không thay đổi kích thước của đối tượng.
fill_horizontal Tăng kích thước của đối tượng theo chiều ngang nếu cần để đối tượng lấp đầy hoàn toàn vùng chứa.
center Đặt đối tượng vào giữa vùng chứa của nó ở cả trục dọc và trục ngang, không thay đổi kích thước của đối tượng.
fill Tăng kích thước của đối tượng theo chiều dọc và chiều ngang nếu cần để đối tượng lấp đầy hoàn toàn vùng chứa. Đây là lựa chọn mặc định.
clip_vertical Bạn có thể đặt tuỳ chọn bổ sung để các cạnh trên và/hoặc dưới cùng của đối tượng con được cắt theo giới hạn của vùng chứa. Việc cắt dựa trên trọng lực dọc: trọng lực đỉnh cắt cạnh dưới, trọng lực đáy cắt cạnh trên, và không cắt cả hai cạnh.
clip_horizontal Bạn có thể đặt tuỳ chọn bổ sung để các cạnh bên trái và/hoặc bên phải của đối tượng con được cắt theo giới hạn của vùng chứa. Việc cắt dựa trên trọng lực ngang: trọng lực bên trái cắt cạnh phải, trọng lực bên phải cắt cạnh trái, và không cắt cả hai cạnh.
android:mipMap
Boolean. Bật hoặc tắt tính năng chỉnh nét ngoài cho mipmap. Vui lòng xem setHasMipMap() để biết thêm thông tin. Giá trị mặc định là sai.
android:tileMode
Từ khoá. Xác định chế độ xếp kề. Khi bạn bật chế độ xếp kề, bitmap được lặp lại. Thuộc tính Trọng lực bị bỏ qua khi bạn bật chế độ xếp kề.

Phải là một trong các giá trị hằng số sau đây:

Giá trịMô tả
disabled Không được xếp kề bitmap. Đây là giá trị mặc định.
clamp Sao chép màu viền nếu chương trình đổ bóng vẽ ngoài giới hạn ban đầu của nó
repeat Lặp lại hình ảnh của chương trình đổ bóng theo chiều ngang và chiều dọc.
mirror Lặp lại hình ảnh của chương trình đổ bóng theo chiều ngang và chiều dọc, xen kẽ hình ảnh phản chiếu để các hình ảnh liền kề luôn liền nhau.
ví dụ:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/icon"
    android:tileMode="repeat" />
xem thêm:

9-Patch

NinePatch là hình ảnh PNG, trong đó bạn có thể xác định các vùng có thể co giãn mà Android sẽ điều chỉnh theo tỷ lệ khi nội dung trong Chế độ xem vượt quá giới hạn hình ảnh thông thường. Bạn thường chỉ định loại hình ảnh này làm nền của Chế độ xem có ít nhất một kích thước được đặt thành "wrap_content" và khi Chế độ xem tăng lên để phù hợp với nội dung, hình ảnh 9-Patch cũng được điều chỉnh theo tỷ lệ để phù hợp với kích thước của Chế độ xem. Một ví dụ về cách sử dụng hình ảnh 9-Patch làm nền mà tiện ích Button tiêu chuẩn của Android sử dụng. Tiện ích này phải kéo dài để chứa văn bản (hoặc hình ảnh) bên trong nút.

Tương tự như với bitmap thông thường, bạn có thể tham chiếu tệp 9-Patch trực tiếp hoặc từ một tài nguyên được XML xác định.

Để thảo luận đầy đủ về cách tạo tệp 9-Patch với các vùng có thể co giãn, vui lòng xem tài liệu về Đồ hoạ 2D.

Tệp 9-Patch

vị trí tệp:
res/drawable/filename.9.png
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến NinePatchDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
ví dụ:
Với hình ảnh được lưu tại res/drawable/myninepatch.9.png, tệp XML bố cục này sẽ áp dụng hình ảnh 9-Patch cho một Chế độ xem:
<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/myninepatch" />
xem thêm:

XML 9-Patch

XML 9-Patch là một tài nguyên được xác định trong tệp XML trỏ đến tệp 9-Patch. XML có thể chỉ định việc phối màu cho hình ảnh.

vị trí tệp:
res/drawable/filename.xml
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến NinePatchDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
cú pháp:
<?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"] />
phần tử:
<nine-patch>
Xác định nguồn 9-Patch và các thuộc tính của nguồn đó.

thuộc tính:

xmlns:android
Chuỗi. Bắt buộc. Xác định không gian tên XML phải là "http://schemas.android.com/apk/res/android".
android:src
Tài nguyên có thể vẽ. Bắt buộc. Tham chiếu đến tệp 9-Patch.
android:dither
Boolean. Bật hoặc tắt tính năng phối màu của bitmap nếu bitmap không có cùng cấu hình pixel với màn hình (ví dụ như một bitmap ARGB 8888 với màn hình RGB 565).
ví dụ:
<?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" />

Danh sách lớp

LayerDrawable là một đối tượng có thể vẽ quản lý một loạt các đối tượng có thể vẽ khác. Mỗi đối tượng có thể vẽ trong danh sách được vẽ theo thứ tự của danh sách. Đối tượng có thể vẽ cuối cùng trong danh sách sẽ được vẽ ở trên cùng.

Mỗi đối tượng có thể vẽ được biểu thị bằng phần tử <item> bên trong một phần tử <layer-list>.

vị trí tệp:
res/drawable/filename.xml
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến LayerDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
cú pháp:
<?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>
phần tử:
<layer-list>
Bắt buộc. Đây phải là phần tử gốc. Chứa một hoặc nhiều phần tử <item>.

thuộc tính:

xmlns:android
Chuỗi. Bắt buộc. Xác định không gian tên XML phải là "http://schemas.android.com/apk/res/android".
<item>
Xác định đối tượng có thể vẽ để đặt trong lớp vẽ được và ở vị trí được xác định bằng các thuộc tính của đối tượng đó. Phải là phần tử con của phần tử <layer-list>. Chấp nhận các phần tử con <bitmap>.

thuộc tính:

android:drawable
Tài nguyên có thể vẽ. Bắt buộc. Tham chiếu đến một tài nguyên có thể vẽ.
android:id
Mã nhận dạng tài nguyên. Mã nhận dạng tài nguyên duy nhất cho đối tượng có thể vẽ này. Để tạo mã nhận dạng tài nguyên mới cho mục này, hãy sử dụng biểu mẫu: "@+id/name". Biểu tượng dấu cộng cho biết mã này phải được tạo dưới dạng mã nhận dạng mới. Bạn có thể sử dụng giá trị nhận dạng này để truy xuất và sửa đổi đối tượng có thể vẽ bằng View.findViewById() hoặc Activity.findViewById().
android:top
Thứ nguyên. Độ lệch trên cùng, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:right
Thứ nguyên. Độ lệch bên phải, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:bottom
Thứ nguyên. Độ lệch dưới cùng, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:left
Thứ nguyên. Độ lệch bên trái, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.

Tất cả các mục có thể vẽ được điều chỉnh theo tỷ lệ cho phù hợp với kích thước của vùng chứa Chế độ xem theo mặc định. Do đó, việc đặt hình ảnh của bạn trong danh sách lớp ở các vị trí khác nhau có thể làm tăng kích thước của Chế độ xem và một số hình ảnh có tỷ lệ phù hợp. Để tránh việc điều chỉnh tỷ lệ các mục trong danh sách, hãy sử dụng phần tử <bitmap> bên trong phần tử <item> để chỉ định đối tượng có thể vẽ và xác định trọng lực cho một đối tượng không điều chỉnh tỷ lệ, chẳng hạn như "center". Ví dụ như <item> sau đây xác định một mục sẽ điều chỉnh theo tỷ lệ để vừa với Chế độ xem vùng chứa của mục:

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

Để tránh việc điều chỉnh tỷ lệ, ví dụ sau đây sẽ sử dụng phần tử <bitmap> có trọng tâm:

<item>
  <bitmap android:src="@drawable/image"
          android:gravity="center" />
</item>
ví dụ:
Tệp XML được lưu vào 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>

Vui lòng lưu ý là ví dụ này sử dụng phần tử <bitmap> lồng nhau để xác định tài nguyên có thể vẽ cho mỗi mục có trọng lực "ở giữa". Điều này đảm bảo việc không có hình ảnh nào được điều chỉnh tỷ lệ cho phù hợp với kích thước của vùng chứa, do việc thay đổi kích thước gây ra bởi độ lệch của hình ảnh.

Tệp XML bố cục này áp dụng đối tượng có thể vẽ cho một Chế độ xem:

<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/layers" />

Kết quả là một ngăn xếp các hình ảnh có độ lệch ngày càng tăng:

xem thêm:

Danh sách trạng thái

StateListDrawable là một đối tượng có thể vẽ được xác định trong tệp XML. Đối tượng này sử dụng một số hình ảnh khác nhau để đại diện cho cùng một hình ảnh đồ hoạ, tuỳ thuộc vào trạng thái của đối tượng. Ví dụ như một tiện ích Button có thể tồn tại ở một trong số các trạng thái khác nhau (nhấn, đặt tiêu điểm hoặc không trạng thái nào cả). Và khi sử dụng danh sách trạng thái có thể vẽ, bạn có thể cung cấp hình nền khác nhau cho mỗi trạng thái.

Bạn có thể mô tả danh sách trạng thái trong một tệp XML. Mỗi hình ảnh đồ hoạ được biểu thị bằng phần tử <item> bên trong một phần tử <selector>. Mỗi <item> sử dụng nhiều thuộc tính để mô tả trạng thái mà nó được dùng làm hình ảnh đồ hoạ cho đối tượng có thể vẽ.

Trong mỗi lần thay đổi trạng thái, danh sách trạng thái sẽ được chuyển từ trên xuống dưới, và mục đầu tiên khớp với trạng thái hiện tại sẽ được sử dụng. Lựa chọn này không dựa trên "kết quả phù hợp nhất", mà chỉ đơn giản là mục đầu tiên đáp ứng tiêu chí tối thiểu của trạng thái.

vị trí tệp:
res/drawable/filename.xml
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến StateListDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
cú pháp:
<?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>
phần tử:
<selector>
Bắt buộc. Đây phải là phần tử gốc. Chứa một hoặc nhiều phần tử <item>.

thuộc tính:

xmlns:android
Chuỗi. Bắt buộc. Xác định không gian tên XML phải là "http://schemas.android.com/apk/res/android".
android:constantSize
Boolean. "đúng" nếu kích thước nội bộ được báo cáo của đối tượng có thể vẽ không đổi khi trạng thái thay đổi (kích thước tối đa của tất cả các trạng thái); "sai" nếu kích thước thay đổi theo trạng thái hiện tại. Mặc định là sai.
android:dither
Boolean. "đúng" để bật tính năng phối màu của bitmap nếu bitmap không có cùng cấu hình pixel với màn hình (ví dụ như bitmap ARGB 8888 có màn hình RGB 565); "sai" để tắt tính năng phối màu. Mặc định là đúng.
android:variablePadding
Boolean. "đúng" nếu khoảng đệm của đối tượng có thể vẽ phải thay đổi dựa trên trạng thái hiện tại đã được chọn; "sai" nếu khoảng đệm phải giữ nguyên (dựa trên khoảng đệm tối đa của tất cả các trạng thái). Việc bật tính năng này yêu cầu bạn xử lý việc thực hiện bố cục khi trạng thái thay đổi, điều này thường không được hỗ trợ. Mặc định là sai.
<item>
Xác định đối tượng có thể vẽ để sử dụng trong một số trạng thái nhất định, như được mô tả bằng các thuộc tính của đối tượng đó. Phải là phần tử con của phần tử <selector>.

thuộc tính:

android:drawable
Tài nguyên có thể vẽ. Bắt buộc. Tham chiếu đến một tài nguyên có thể vẽ.
android:state_pressed
Boolean. "đúng" nếu sử dụng mục này khi đối tượng được nhấn (chẳng hạn như khi chạm hoặc nhấp vào một nút); "sai" nếu sử dụng mục này được sử dụng ở trạng thái mặc định, không được nhấn.
android:state_focused
Boolean. "đúng" nếu sử dụng mục này khi đối tượng có tiêu điểm nhập (chẳng hạn như khi người dùng chọn một phương thức nhập văn bản); "sai" nếu mục này được sử dụng ở trạng thái mặc định, không phải tiêu điểm.
android:state_hovered
Boolean. "đúng" nếu sử dụng mục này khi đối tượng di chuột bằng con trỏ; "sai" nếu mục này được sử dụng ở trạng thái mặc định, không phải di chuột. Thông thường, đối tượng vẽ được này có thể giống với đối tượng có thể vẽ dùng cho trạng thái "tập trung".

Ra mắt trong API cấp 14

android:state_selected
Boolean. "đúng" nếu sử dụng mục này khi đối tượng là lựa chọn người dùng hiện tại khi điều hướng bằng một thành phần điều khiển hướng (chẳng hạn như khi di chuyển qua một danh sách bằng d-pad); "sai" nếu mục này không được sử dụng khi đối tượng không được chọn.

Trạng thái đã chọn được sử dụng khi tiêu điểm (android:state_focused) không đủ (chẳng hạn như khi chế độ xem danh sách có tiêu điểm và một mục trong đó được chọn bằng d-pad).

android:state_checkable
Boolean. "đúng" nếu sử dụng mục này khi đối tượng có thể kiểm tra được; "sai" nếu sử dụng mục này khi không thể kiểm tra được đối tượng. (Chỉ hữu ích nếu đối tượng có thể chuyển đổi giữa tiện ích có thể kiểm tra và không thể kiểm tra.)
android:state_checked
Boolean. "đúng" nếu sử dụng mục này khi đối tượng được kiểm tra; "sai" nếu sử dụng mục này khi đối tượng không được kiểm tra.
android:state_enabled
Boolean. "đúng" nếu sử dụng mục này khi đối tượng được bật (có thể nhận sự kiện nhấn/nhấp); "sai" nếu mục này được sử dụng khi đối tượng bị tắt.
android:state_activated
Boolean. "đúng" nếu sử dụng mục này khi đối tượng được kích hoạt dưới dạng lựa chọn liên tục (chẳng hạn như để "làm nổi bật" mục danh sách đã chọn trước đó trong chế độ xem điều hướng liên tục); "sai" nếu sử dụng mục này khi đối tượng không được kích hoạt.

Ra mắt trong API cấp 11

android:state_window_focused
Boolean. "đúng" nếu mục này được sử dụng khi cửa sổ ứng dụng có tiêu điểm (ứng dụng ở nền trước), "sai" nếu mục này được sử dụng khi cửa sổ ứng dụng không có tiêu điểm (chẳng hạn như nếu ngăn thông báo được kéo xuống hoặc hộp thoại xuất hiện).

Lưu ý: Hãy nhớ là Android áp dụng mục đầu tiên trong danh sách trạng thái khớp với trạng thái hiện tại của đối tượng. Vì vậy, nếu mục đầu tiên trong danh sách không chứa thuộc tính trạng thái nào ở trên, thì mục đó sẽ luôn được áp dụng. Đó là lý do giá trị mặc định của bạn phải luôn là giá trị cuối cùng (như được minh hoạ trong ví dụ sau).

ví dụ:
Tệp XML được lưu vào 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>

Tệp XML bố cục này áp dụng danh sách trạng thái có thể vẽ cho một Nút:

<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/button" />
xem thêm:

Danh sách cấp độ

Một đối tượng có thể vẽ quản lý một số đối tượng có thể vẽ thay thế, mỗi đối tượng có thể chỉ định một giá trị số tối đa. Việc đặt giá trị cấp của đối tượng có thể vẽ bằng setLevel() sẽ tải tài nguyên có thể vẽ trong danh sách cấp có giá trị android:maxLevel lớn hơn hoặc bằng giá trị được truyền đến phương thức đó.

vị trí tệp:
res/drawable/filename.xml
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến LevelListDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
cú pháp:
<?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>
phần tử:
<level-list>
Đây phải là phần tử gốc. Chứa một hoặc nhiều phần tử <item>.

thuộc tính:

xmlns:android
Chuỗi. Bắt buộc. Xác định không gian tên XML phải là "http://schemas.android.com/apk/res/android".
<item>
Xác định một đối tượng có thể vẽ để sử dụng ở một cấp độ nhất định.

thuộc tính:

android:drawable
Tài nguyên có thể vẽ. Bắt buộc. Tham chiếu đến một tài nguyên có thể vẽ để lồng ghép.
android:maxLevel
Số nguyên. Cấp tối đa được phép sử dụng cho mục này.
android:minLevel
Số nguyên. Cấp tối thiểu được phép sử dụng cho mục này.
ví dụ:
<?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>

Sau khi áp dụng cấp này cho View, bạn có thể thay đổi cấp bằng setLevel() hoặc setImageLevel().

xem thêm:

Chuyển đổi giữa các đối tượng có thể vẽ

TransitionDrawable là một đối tượng vẽ được có thể chuyển đổi ở dạng mờ dần giữa hai tài nguyên có thể vẽ.

Mỗi đối tượng có thể vẽ được biểu thị bằng phần tử <item> bên trong một phần tử <transition>. Không hỗ trợ quá 2 mục. Để chuyển tiếp, hãy gọi startTransition(). Để chuyển đổi lùi về phía sau, hãy gọi reverseTransition().

vị trí tệp:
res/drawable/filename.xml
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến TransitionDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
cú pháp:
<?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>
phần tử:
<transition>
Bắt buộc. Đây phải là phần tử gốc. Chứa một hoặc nhiều phần tử <item>.

thuộc tính:

xmlns:android
Chuỗi. Bắt buộc. Xác định không gian tên XML phải là "http://schemas.android.com/apk/res/android".
<item>
Xác định một đối tượng vẽ được để sử dụng trong quá trình chuyển đổi đối tượng có thể vẽ. Phải là phần tử con của phần tử <transition>. Chấp nhận các phần tử con <bitmap>.

thuộc tính:

android:drawable
Tài nguyên có thể vẽ. Bắt buộc. Tham chiếu đến một tài nguyên có thể vẽ.
android:id
Mã nhận dạng tài nguyên. Mã nhận dạng tài nguyên duy nhất cho đối tượng có thể vẽ này. Để tạo mã nhận dạng tài nguyên mới cho mục này, hãy sử dụng biểu mẫu: "@+id/name". Biểu tượng dấu cộng cho biết mã này phải được tạo dưới dạng mã nhận dạng mới. Bạn có thể sử dụng giá trị nhận dạng này để truy xuất và sửa đổi đối tượng có thể vẽ bằng View.findViewById() hoặc Activity.findViewById().
android:top
Số nguyên. Độ lệch trên cùng tính bằng pixel.
android:right
Số nguyên. Độ lệch bên phải tính bằng pixel.
android:bottom
Số nguyên. Độ lệch dưới cùng tính bằng pixel.
android:left
Số nguyên. Độ lệch bên trái tính bằng pixel.
ví dụ:
Tệp XML được lưu vào 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>

Tệp XML bố cục này áp dụng đối tượng có thể vẽ cho một Chế độ xem:

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

Và mã sau đây thực hiện quá trình chuyển đổi 500 mili giây từ mục đầu tiên sang mục thứ hai:

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);
}
xem thêm:

Lồng ghép các đối tượng có thể vẽ

Một đối tượng có thể vẽ được xác định trong tệp XML sẽ lồng ghép một đối tượng có thể vẽ khác theo khoảng cách đã chỉ định. Điều này rất hữu ích khi Chế độ xem cần nền nhỏ hơn giới hạn thực tế của Chế độ xem.

vị trí tệp:
res/drawable/filename.xml
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến InsetDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
cú pháp:
<?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" />
phần tử:
<inset>
Xác định phần lồng ghép các đối tượng có thể vẽ. Đây phải là phần tử gốc.

thuộc tính:

xmlns:android
Chuỗi. Bắt buộc. Xác định không gian tên XML phải là "http://schemas.android.com/apk/res/android".
android:drawable
Tài nguyên có thể vẽ. Bắt buộc. Tham chiếu đến một tài nguyên có thể vẽ để lồng ghép.
android:insetTop
Thứ nguyên. Phần lồng ghép trên cùng, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên
android:insetRight
Thứ nguyên. Phần lồng ghép bên phải, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên
android:insetBottom
Thứ nguyên. Phần lồng ghép dưới cùng, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên
android:insetLeft
Thứ nguyên. Phần lồng ghép bên trái, dưới dạng giá trị thứ nguyên hoặctài nguyên thứ nguyên
ví dụ:
<?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" />
xem thêm:

Cắt bớt đối tượng có thể vẽ

Một đối tượng có thể vẽ được xác định trong tệp XML sẽ cắt bớt một đối tượng có thể vẽ khác dựa trên cấp độ hiện tại của đối tượng có thể vẽ này. Bạn có thể kiểm soát chiều rộng và chiều cao của đối tượng có thể vẽ được cắt bớt dựa trên cấp độ, cũng như trọng lực để kiểm soát vị trí đặt đối tượng trong vùng chứa tổng thể của đối tượng đó. Thường được dùng nhất để triển khai những nội dung như thanh tiến trình.

vị trí tệp:
res/drawable/filename.xml
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến ClipDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
cú pháp:
<?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"] />
phần tử:
<clip>
Xác định việc cắt bớt đối tượng có thể vẽ. Đây phải là phần tử gốc.

thuộc tính:

xmlns:android
Chuỗi. Bắt buộc. Xác định không gian tên XML phải là "http://schemas.android.com/apk/res/android".
android:drawable
Tài nguyên có thể vẽ. Bắt buộc. Tham chiếu đến một tài nguyên có thể vẽ sẽ được cắt bớt.
android:clipOrientation
Từ khoá. Hướng cắt.

Phải là một trong các giá trị hằng số sau đây:

Giá trịMô tả
horizontal Cắt đối tượng có thể vẽ theo chiều ngang.
vertical Cắt đối tượng có thể vẽ theo chiều dọc.
android:gravity
Từ khoá. Chỉ định vị trí cắt trong đối tượng có thể vẽ.

Phải là một hoặc nhiều (được phân tách bằng dấu '|') các giá trị hằng số sau:

Giá trịMô tả
top Đặt đối tượng lên đầu vùng chứa, không thay đổi kích thước của đối tượng. Khi clipOrientation"vertical", hoạt động cắt sẽ diễn ra ở phần cuối đối tượng có thể vẽ.
bottom Đặt đối tượng ở cuối vùng chứa, không thay đổi kích thước của đối tượng. Khi clipOrientation"vertical", hoạt động cắt sẽ diễn ra ở phần đầu của đối tượng có thể vẽ.
left Đặt đối tượng ở cạnh bên trái của vùng chứa, không thay đổi kích thước của đối tượng. Đây là lựa chọn mặc định. Khi clipOrientation"horizontal", hoạt động cắt sẽ diễn ra ở phía bên phải của đối tượng có thể vẽ. Đây là lựa chọn mặc định.
right Đặt đối tượng ở cạnh bên phải của vùng chứa, không thay đổi kích thước của đối tượng. Khi clipOrientation"horizontal", hoạt động cắt sẽ diễn ra ở phía bên trái của đối tượng có thể vẽ.
center_vertical Đặt đối tượng ở giữa vùng chứa theo chiều dọc, không thay đổi kích thước của đối tượng. Thao tác cắt sẽ hoạt động giống như khi trọng lực là "center".
fill_vertical Tăng kích thước của đối tượng theo chiều dọc nếu cần để đối tượng lấp đầy hoàn toàn vùng chứa. Khi clipOrientation"vertical" thì không có hoạt động cắt nào diễn ra do đối tượng có thể vẽ lấp đầy không gian theo chiều dọc (trừ khi cấp độ của đối tượng có thể vẽ là 0, đối tượng không hiển thị trong trường hợp này).
center_horizontal Đặt đối tượng ở giữa vùng chứa theo chiều ngang, không thay đổi kích thước của đối tượng. Thao tác cắt sẽ hoạt động giống như khi trọng lực là "center".
fill_horizontal Tăng kích thước của đối tượng theo chiều ngang nếu cần để đối tượng lấp đầy hoàn toàn vùng chứa. Khi clipOrientation"horizontal" thì không có hoạt động cắt nào diễn ra do đối tượng có thể vẽ lấp đầy không gian theo chiều ngang (trừ khi cấp độ của đối tượng có thể vẽ là 0, đối tượng không hiển thị trong trường hợp này).
center Đặt đối tượng vào giữa vùng chứa của nó ở cả trục dọc và trục ngang, không thay đổi kích thước của đối tượng. Khi clipOrientation"horizontal", hoạt động cắt sẽ diễn ra ở bên trái và bên phải. Khi clipOrientation"vertical", hoạt động cắt sẽ diễn ra ở phần trên cùng và dưới cùng.
fill Tăng kích thước của đối tượng theo chiều dọc và chiều ngang nếu cần để đối tượng lấp đầy hoàn toàn vùng chứa. Không có hoạt động cắt nào diễn ra vì đối tượng có thể vẽ lấp đầy không gian theo chiều ngang và chiều dọc (trừ khi cấp độ của đối tượng có thể vẽ là 0, đối tượng không hiển thị trong trường hợp này).
clip_vertical Bạn có thể đặt tuỳ chọn bổ sung để các cạnh trên và/hoặc dưới cùng của đối tượng con được cắt theo giới hạn của vùng chứa. Việc cắt dựa trên trọng lực dọc: trọng lực đỉnh cắt cạnh dưới, trọng lực đáy cắt cạnh trên, và không cắt cả hai cạnh.
clip_horizontal Bạn có thể đặt tuỳ chọn bổ sung để các cạnh bên trái và/hoặc bên phải của đối tượng con được cắt theo giới hạn của vùng chứa. Việc cắt dựa trên trọng lực ngang: trọng lực bên trái cắt cạnh phải, trọng lực bên phải cắt cạnh trái, và không cắt cả hai cạnh.
ví dụ:
Tệp XML được lưu vào 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" />

XML bố cục sau đây áp dụng phần cắt của đối tượng có thể vẽ cho Chế độ xem:

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

Mã sau đây lấy đối tượng có thể vẽ và tăng thời lượng của đoạn cắt để hiển thị hình ảnh dần dần:

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);
}

Việc tăng cấp độ sẽ làm giảm thời lượng của đoạn cắt và từ từ hiển thị hình ảnh. Đây là cấp 7000:

Lưu ý: Cấp mặc định là 0, cấp này được cắt hoàn toàn nên hình ảnh sẽ không hiển thị. Khi cấp độ là 10.000, hình ảnh sẽ không bị cắt bớt và hiển thị hoàn toàn.

xem thêm:

Điều chỉnh tỷ lệ các đối tượng có thể vẽ

Một đối tượng có thể vẽ được xác định trong tệp XML sẽ thay đổi kích thước của một đối tượng có thể vẽ khác dựa trên cấp độ hiện tại của đối tượng đó.

vị trí tệp:
res/drawable/filename.xml
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến ScaleDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
cú pháp:
<?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" />
phần tử:
<scale>
Xác định tỷ lệ của đối tượng có thể vẽ. Đây phải là phần tử gốc.

thuộc tính:

xmlns:android
Chuỗi. Bắt buộc. Xác định không gian tên XML phải là "http://schemas.android.com/apk/res/android".
android:drawable
Tài nguyên có thể vẽ. Bắt buộc. Tham chiếu đến một tài nguyên có thể vẽ.
android:scaleGravity
Từ khoá. Chỉ định vị trí trọng lực sau khi điều chỉnh theo tỷ lệ.

Phải là một hoặc nhiều (được phân tách bằng dấu '|') các giá trị hằng số sau:

Giá trịMô tả
top Đặt đối tượng lên đầu vùng chứa, không thay đổi kích thước của đối tượng.
bottom Đặt đối tượng ở cuối vùng chứa, không thay đổi kích thước của đối tượng.
left Đặt đối tượng ở cạnh bên trái của vùng chứa, không thay đổi kích thước của đối tượng. Đây là lựa chọn mặc định.
right Đặt đối tượng ở cạnh bên phải của vùng chứa, không thay đổi kích thước của đối tượng.
center_vertical Đặt đối tượng ở giữa vùng chứa theo chiều dọc, không thay đổi kích thước của đối tượng.
fill_vertical Tăng kích thước của đối tượng theo chiều dọc nếu cần để đối tượng lấp đầy hoàn toàn vùng chứa.
center_horizontal Đặt đối tượng ở giữa vùng chứa theo chiều ngang, không thay đổi kích thước của đối tượng.
fill_horizontal Tăng kích thước của đối tượng theo chiều ngang nếu cần để đối tượng lấp đầy hoàn toàn vùng chứa.
center Đặt đối tượng vào giữa vùng chứa của nó ở cả trục dọc và trục ngang, không thay đổi kích thước của đối tượng.
fill Tăng kích thước của đối tượng theo chiều dọc và chiều ngang nếu cần để đối tượng lấp đầy hoàn toàn vùng chứa.
clip_vertical Bạn có thể đặt tuỳ chọn bổ sung để các cạnh trên và/hoặc dưới cùng của đối tượng con được cắt theo giới hạn của vùng chứa. Việc cắt dựa trên trọng lực dọc: trọng lực đỉnh cắt cạnh dưới, trọng lực đáy cắt cạnh trên, và không cắt cả hai cạnh.
clip_horizontal Bạn có thể đặt tuỳ chọn bổ sung để các cạnh bên trái và/hoặc bên phải của đối tượng con được cắt theo giới hạn của vùng chứa. Việc cắt dựa trên trọng lực ngang: trọng lực bên trái cắt cạnh phải, trọng lực bên phải cắt cạnh trái, và không cắt cả hai cạnh.
android:scaleHeight
Phần trăm. Tỷ lệ chiều cao được biểu thị dưới dạng phần trăm giới hạn của đối tượng có thể vẽ được. Định dạng của giá trị là XX%. Chẳng hạn như 100%, 12,5%, v.v.
android:scaleWidth
Phần trăm. Tỷ lệ chiều rộng được biểu thị dưới dạng phần trăm giới hạn của đối tượng có thể vẽ được. Định dạng của giá trị là XX%. Chẳng hạn như 100%, 12,5%, v.v.
ví dụ:
<?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%" />
xem thêm:

Hình dạng có thể vẽ

Đây là hình dạng chung được xác định trong tệp XML.

vị trí tệp:
res/drawable/filename.xml
Tên tệp được dùng làm mã nhận dạng tài nguyên.
loại dữ liệu tài nguyên được biên dịch:
Con trỏ tài nguyên đến GradientDrawable.
mã tham chiếu tài nguyên:
Trong Java: R.drawable.filename
Trong XML: @[package:]drawable/filename
cú pháp:
<?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>
phần tử:
<shape>
Hình dạng có thể vẽ. Đây phải là phần tử gốc.

thuộc tính:

xmlns:android
Chuỗi. Bắt buộc. Xác định không gian tên XML phải là "http://schemas.android.com/apk/res/android".
android:shape
Từ khoá. Xác định loại hình dạng. Các giá trị hợp lệ là:
Giá trịMô tả
"rectangle" Một hình chữ nhật lấp đầy Chế độ xem vùng chứa. Đây là hình dạng mặc định.
"oval" Một hình bầu dục vừa vặn với kích thước của Chế độ xem vùng chứa.
"line" Một đường kẻ ngang trải dài theo chiều rộng của Chế độ xem vùng chứa. Hình dạng này yêu cầu phần tử <stroke> để xác định chiều rộng của đường kẻ.
"ring" Hình dạng chiếc nhẫn.

Các thuộc tính sau chỉ được dùng khi android:shape="ring":

android:innerRadius
Thứ nguyên. Bán kính của phần bên trong vòng nhẫn (lỗ ở giữa) ở dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:innerRadiusRatio
Số thực có độ chính xác đơn. Bán kính của phần bên trong vòng nhẫn được biểu thị bằng tỷ lệ chiều rộng của vòng nhẫn. Chẳng hạn như nếu android:innerRadiusRatio="5", thì bán kính bên trong bằng chiều rộng của vòng nhẫn chia cho 5. Giá trị này sẽ bị android:innerRadius ghi đè. Giá trị mặc định là 9.
android:thickness
Thứ nguyên. Độ dày của vòng nhẫn, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:thicknessRatio
Số thực có độ chính xác đơn. Độ dày của vòng nhẫn được biểu thị bằng tỷ lệ chiều rộng của vòng nhẫn. Chẳng hạn như nếu android:thicknessRatio="2", thì độ dày bằng với chiều rộng của vòng nhẫn chia cho 2. Giá trị này sẽ bị android:innerRadius ghi đè. Giá trị mặc định là 3.
android:useLevel
Boolean. "đúng" nếu được sử dụng làm LevelListDrawable. Thông thường, giá trị này phải là "sai" hoặc hình dạng của bạn có thể không xuất hiện.
<corners>
Tạo các góc tròn cho hình dạng. Chỉ áp dụng khi hình dạng là hình chữ nhật.

thuộc tính:

android:radius
Thứ nguyên. Bán kính cho tất cả các góc, dưới dạng một giá trị thứ nguyên hoặc tài nguyên thứ nguyên. Giá trị này sẽ bị ghi đè cho từng góc bởi các thuộc tính sau.
android:topLeftRadius
Thứ nguyên. Bán kính cho góc trên cùng bên trái dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:topRightRadius
Thứ nguyên. Bán kính cho góc trên cùng bên phải dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:bottomLeftRadius
Thứ nguyên. Bán kính cho góc dưới cùng bên trái dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:bottomRightRadius
Thứ nguyên. Bán kính cho góc dưới cùng bên phải dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.

Lưu ý: Mỗi góc (ban đầu) phải được cung cấp một bán kính góc lớn hơn 1, nếu không các góc sẽ không được làm tròn. Nếu bạn không muốn các góc cụ thể được làm tròn, có một giải pháp là sử dụng android:radius để đặt bán kính của góc mặc định lớn hơn 1, nhưng sau đó ghi đè mỗi góc và mọi góc với các giá trị mà bạn thực sự muốn, cung cấp giá trị 0 ("0dp") vào vị trí bạn không muốn làm tròn góc.

<gradient>
Chỉ định độ dốc màu cho hình dạng.

thuộc tính:

android:angle
Số nguyên. Góc cho độ dốc tính bằng độ. 0 là từ trái sang phải, 90 là từ dưới lên trên. Đây phải là bội số của 45. Giá trị mặc định là 0.
android:centerX
Số thực có độ chính xác đơn. Vị trí X tương đối cho tâm của độ dốc (0 - 1.0).
android:centerY
Số thực có độ chính xác đơn. Vị trí Y tương đối cho tâm của độ dốc (0 - 1.0).
android:centerColor
Màu. Màu tuỳ chọn nằm giữa màu bắt đầu và màu kết thúc, dưới dạng giá trị thập lục phân hoặc tài nguyên màu.
android:endColor
Màu. Màu kết thúc, dưới dạng giá trị thập lục phân hoặc tài nguyên màu.
android:gradientRadius
Số thực có độ chính xác đơn. Bán kính cho độ dốc. Chỉ được áp dụng khi android:type="radial".
android:startColor
Màu. Màu bắt đầu, dưới dạng giá trị thập lục phân hoặc tài nguyên màu.
android:type
Từ khoá. Loại mẫu độ dốc sẽ áp dụng. Các giá trị hợp lệ là:
Giá trịMô tả
"linear" Độ dốc theo tuyến tính. Đây là lựa chọn mặc định.
"radial" Độ dốc theo bán kính. Màu bắt đầu là màu trung tâm.
"sweep" Độ dốc theo đường quét.
android:useLevel
Boolean. "đúng" nếu hàm này được dùng làm LevelListDrawable.
<padding>
Khoảng đệm để áp dụng cho phần tử Chế độ xem vùng chứa (khoảng đệm này sẽ đệm vị trí của nội dung Chế độ xem chứ không phải hình dạng).

thuộc tính:

android:left
Thứ nguyên. Khoảng đệm bên trái, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:top
Thứ nguyên. Khoảng đệm trên cùng, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:right
Thứ nguyên. Khoảng đệm bên phải, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:bottom
Thứ nguyên. Khoảng đệm dưới cùng, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
<size>
Kích thước của hình dạng.

thuộc tính:

android:height
Thứ nguyên. Chiều cao của hình dạng, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:width
Thứ nguyên. Chiều rộng của hình dạng, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.

Lưu ý: Hình dạng điều chỉnh theo tỷ lệ kích thước của Chế độ xem vùng chứa tương ứng với kích thước được xác định ở đây, theo mặc định. Khi sử dụng hình dạng trong ImageView, bạn có thể hạn chế việc điều chỉnh tỷ lệ bằng cách đặt android:scaleType thành "center".

<solid>
Một màu đồng nhất để lấp đầy hình dạng.

thuộc tính:

android:color
Màu. Màu sắc áp dụng cho hình dạng, dưới dạng giá trị thập lục phân hoặc tài nguyên màu.
<stroke>
Một đường gạch cho hình dạng.

thuộc tính:

android:width
Thứ nguyên. Độ dày của đường kẻ, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên.
android:color
Màu. Màu của đường kẻ, dưới dạng giá trị thập lục phân hoặc tài nguyên màu.
android:dashGap
Thứ nguyên. Khoảng cách giữa các đường gạch ngang, dưới dạng giá trị thứ nguyên hoặc tài nguyên thứ nguyên. Chỉ hợp lệ nếu bạn đặt android:dashWidth.
android:dashWidth
Thứ nguyên. Kích thước của mỗi đường gạch ngang, dưới dạng một giá trị thứ nguyên hoặc tài nguyên thứ nguyên. Chỉ hợp lệ nếu bạn đặt android:dashGap.
ví dụ:
Tệp XML được lưu vào 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>

Tệp XML bố cục này áp dụng hình dạng có thể vẽ cho một Chế độ xem:

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

Mã xử lý ứng dụng này lấy hình dạng có thể vẽ được và áp dụng cho Chế độ xem:

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);
xem thêm: