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

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, , đồng thời 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ó một số loại đối tượng có thể vẽ như sau:

Tệp Bitmap
Tệp đồ hoạ bitmap (PNG, WEBP, JPG hoặc GIF). Tạo BitmapDrawable.
Tệp 9-Patch
Tệp PNG có các vùng có thể co giãn để cho phép hình ảnh thay đổi kích thước 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 mảng gồm các đối tượng có thể vẽ khác. Các đối tượng 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 đồ hoạ 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 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 2 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 có thể vẽ được lồng ghép với 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 khung hiển thị cần có đối tượng có thể vẽ trong nền nhỏ hơn giới hạn thực tế của khung hiển thị.
Cắt bớt đối tượng có thể vẽ
Tệp XML xác định một đối tượng có thể vẽ 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 theo tỷ lệ cho đối tượng có thể vẽ
Tệp XML xác định một đối tượng có thể vẽ mà sẽ thay đổi kích thước của 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 đó. Tạo một ScaleDrawable
Chọn hình dạng cho đối tượ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.

Để biết thông tin về cách tạo AnimationDrawable, hãy xem tài liệu về Tài nguyên ảnh động.

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ự động tối ưu hoá với tính năng nén hình ảnh không tổn hao bằng công cụ aapt trong quy trình xây dựng. Ví dụ: PNG màu thực không yêu cầu quá 256 màu có thể được chuyển đổi thành PNG 8 bit thông qua bảng màu. Kết quả là hình ảnh có chất lượng như nhau nhưng cần ít bộ nhớ hơn.

Hãy lưu ý rằng 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ạng luồng bit để chuyển đổi hình ảnh đó thành một bitmap, hãy đặt hình ảnh 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 là mã 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ụ:
Khi một hình ảnh được lưu vào res/drawable/myimage.png, tệp XML bố cục này sẽ áp dụng hình ảnh đó cho một khung hiển thị:
<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à hiệu ứng đại diện của tệp bitmap thô. XML có thể chỉ định các thuộc tính khác 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 là mã 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>
Bắt buộc. 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. Bạn không cần thực hiện việc này khi <bitmap> được lồng trong <item>.
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, chẳng hạn như bitmap ARGB 8888 trên màn hình RGB 565.
android:filter
Boolean. Bật hoặc tắt tính năng lọc bitmap. Tính năng lọc được 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 giá trị hằng số (được phân tách bằng |) sau đây:

Giá trịNội dung 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ả 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 tham khảo setHasMipMap() để biết thêm thông tin. Giá trị mặc định là false.
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ịNội dung mô tả
disabled Đừng xếp 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ẽ ra ngoài giới hạn ban đầu
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 khung hiển thị 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 khung hiển thị có ít nhất một kích thước được đặt thành "wrap_content".

Khi khung hiển thị 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 khung hiển thị. Một ví dụ về cách sử dụng hình ảnh 9-patch là làm nền cho tiện ích Button tiêu chuẩn của Android. 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, hãy xem bài viết Tạo tệp bitmap có thể thay đổi kích thước (tệp 9-patch).

Tệp 9-patch

vị trí tệp:
res/drawable/filename.9.png
Tên tệp là mã 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ụ:
Khi một hình ảnh được lưu vào 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 khung hiển thị:
<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 là mã 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>
Bắt buộc. 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. Mã 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, chẳng hạn như bitmap ARGB 8888 trên 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ẽ giúp quản lý một mảng gồm 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ự nêu trong danh sách. Đối tượng có thể vẽ cuối cùng trong danh sách sẽ được vẽ ở trên đầu.

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 là mã 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à thành phần 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 đượ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 khung hiển thị 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 khung hiển thị 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ụ: <item> sau đây xác định một mục sẽ điều chỉnh theo tỷ lệ để vừa với khung hiển thị 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>

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 "center". Đ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 khung hiển thị:

<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 nhiều hình ảnh để đạ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ụ: trạng thái của tiện ích Button có thể được nhấn, đặt tâm điểm hoặc không xảy ra hoạt động nào trong số này; khi dùng đối tượng có thể vẽ trong danh sách trạng thái, với mỗi trạng thái, bạn có thể cung cấp một hình nền riêng.

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 đượ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à là dựa trên 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 là mã 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à thành phần 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. "True" 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); "false" nếu kích thước thay đổi theo trạng thái hiện tại. Giá trị mặc định là "false".
android:dither
Boolean. "True" để 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, chẳng hạn như bitmap ARGB 8888 trên màn hình RGB 565; "false" để tắt tính năng phối màu. Giá trị mặc định là "true".
android:variablePadding
Boolean. "True" nếu khoảng đệm của đối tượng có thể vẽ thay đổi dựa trên trạng thái hiện tại đã được chọn; "false" 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ợ. Giá trị mặc định là "false".
<item>
Xác định đối tượng có thể vẽ để sử dụng trong một số trạng thái, 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. "True" nếu sử dụng mục này khi đối tượng được nhấn, chẳng hạn như khi chạm vào một nút; "false" nếu sử dụng mục này ở trạng thái mặc định, không được nhấn.
android:state_focused
Boolean. "True" nếu sử dụng mục này khi đối tượng có tâm đ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; "false" nếu sử dụng mục này ở trạng thái mặc định, không có tâm điểm.
android:state_hovered
Boolean. "True" nếu sử dụng mục này khi con trỏ di chuột qua đối tượng; "false" nếu sử dụng mục này ở trạng thái mặc định, không phải di chuột. Thông thường, đối tượng có thể vẽ này có thể giống với đối tượng có thể vẽ dùng cho trạng thái "lấy làm tâm điểm".

Ra mắt trong API cấp 14

android:state_selected
Boolean. "True" nếu sử dụng mục này khi đối tượng là lựa chọn hiện tại của người dùng 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; "false" nếu dùng mục này khi đối tượng không được chọn.

Trạng thái đã chọn được dùng khi android:state_focused không đủ, chẳng hạn như khi khung hiển thị danh sách có tâm điểm và một mục trong đó được chọn bằng D-pad.

android:state_checkable
Boolean. "True" nếu sử dụng mục này khi đối tượng ở trạng thái có thể chọn; "false" nếu sử dụng mục này khi đối tượng ở trạng thái không thể chọn. Chỉ hữu ích nếu đối tượng có thể chuyển đổi giữa một tiện ích có thể chọn và không thể chọn.
android:state_checked
Boolean. "True" nếu sử dụng mục này khi đối tượng được chọn; "false" nếu dùng mục này khi đối tượng đã bị bỏ chọn.
android:state_enabled
Boolean. "True" nếu sử dụng mục này khi đối tượng được bật, nghĩa là có thể nhận sự kiện chạm hoặc sự kiện nhấp; "false" nếu sử dụng mục này khi đối tượng bị tắt.
android:state_activated
Boolean. "True" 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ư để "đánh dấu" mục trong danh sách đã chọn trước đó ở khung hiển thị điều hướng liên tục; "false" nếu 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. "True" nếu sử dụng mục này khi cửa sổ ứng dụng có tâm điểm, nghĩa là ứng dụng chạy ở nền trước; "false" nếu sử dụng mục này khi cửa sổ ứng dụng không có tâm điểm, ví dụ: 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 ý: Android sẽ á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ước đó, thì mục đó sẽ luôn được áp dụng. Đây là lý do tại sao bạn muốn giá trị mặc định 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 đối tượng có thể vẽ trong danh sách trạng thái 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 là mã 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>
Bắt buộc. Đây phải là thành phần 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 có thể vẽ có thể chuyển đổi ở dạng mờ dần giữa 2 tài nguyên có thể vẽ khác.

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 là mã 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à thành phần 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 đượ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 khung hiển thị:

<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 khung hiển thị cần nền nhỏ hơn giới hạn thực tế của khung hiển thị.

vị trí tệp:
res/drawable/filename.xml
Tên tệp là mã 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>
Bắt buộc. Xác định đối tượng có thể vẽ có phần lồng ghép. Đây phải là thành phần 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ặc tà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 là mã 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>
Bắt buộc. Xác định đối tượng có thể vẽ bị cắt bớt. Đây phải là thành phần 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ịNội dung 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 giá trị hằng số (được phân tách bằng |) sau đây:

Giá trịNội dung 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ẽ.
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ả 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 đối tượng có thể vẽ bị cắt cho một khung hiển thị:

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

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

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, tức là bị 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 là mã 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>
Bắt buộc. Xác định đối tượng có thể vẽ theo tỷ lệ. Đây phải là thành phần 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 giá trị hằng số (được phân tách bằng |) sau đây:

Giá trịNội dung 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ả 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% hoặc 12,5%.
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ẽ. Định dạng của giá trị là XX%, chẳng hạn như 100% hoặc 12,5%.
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 là mã 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>
Bắt buộc. Đối tượng có thể vẽ theo hình dạng. Đây phải là thành phần 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ịNội dung mô tả
"rectangle" Một hình chữ nhật lấp đầy khung hiển thị 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 khung hiển thị vùng chứa.
"line" Một đường kẻ ngang trải dài theo chiều rộng của khung hiển thị 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 được biểu thị bằng tỷ lệ chiều rộng của vòng. 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 chia cho 2. Giá trị này sẽ bị android:innerRadius ghi đè. Giá trị mặc định là 3.
android:useLevel
Boolean. "True" nếu giá trị này được dùng làm LevelListDrawable. Giá trị này thường là "false", nếu không 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 ("0 dp") vào vị trí bạn không muốn làm tròn góc.

<gradient>
Chỉ định màu có độ dốc 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ịNội dung 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. "True" nếu giá trị này được dùng làm LevelListDrawable.
<padding>
Khoảng đệm để áp dụng cho phần tử khung hiển thị vùng chứa. Thao tác này sẽ dùng cho vị trí của nội dung khung hiển thị 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 ý: Theo mặc định, hình dạng chia tỷ lệ theo kích thước của khung hiển thị vùng chứa tương ứng với kích thước được xác định ở đây. 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 đối tượng có thể vẽ theo hình dạng cho một khung hiển thị:

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

Mã xử lý ứng dụng này gọi đối tượng có thể vẽ theo hình dạng và áp dụng cho một khung hiển thị:

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: