Màu động (được thêm vào Android 12) cho phép người dùng cá nhân hoá thiết bị cho phù hợp với bảng phối màu của hình nền cá nhân hoặc thông qua màu đã chọn trong bộ chọn hình nền.
Bạn có thể tận dụng tính năng này bằng cách thêm API DynamicColors
. API này sẽ áp dụng giao diện này cho ứng dụng hoặc hoạt động của bạn để giúp ứng dụng được cá nhân hoá cho người dùng.
![](https://developer.android.com/static/develop/ui/views/theming/images/wallpaper-differing.png?authuser=6&hl=vi)
Trang này đưa ra hướng dẫn triển khai Màu động trong ứng dụng. Tính năng này cũng được cung cấp riêng cho các tiện ích và biểu tượng thích ứng, như mô tả ở phần sau của trang này. Bạn cũng có thể tham khảo lớp học lập trình này.
Cách Android tạo bảng phối màu
Android thực hiện các bước sau để tạo bảng phối màu từ hình nền của người dùng.
Hệ thống sẽ phát hiện các màu chính trong hình nền đã chọn và trích xuất một màu nguồn.
Hệ thống sẽ sử dụng màu nguồn đó để ngoại suy thêm 5 màu chính được gọi là Primary (Chính), Secondary (Cấp hai), Tertiary (Tertiary), Trung lập và Biến thể trung tính.
Hình 2. Ví dụ về việc trích xuất màu nguồn từ hình nền và trích xuất thành 5 màu chính Hệ thống diễn giải mỗi màu chính thành một bảng sắc độ gồm 13 sắc độ.
Hình 3. Ví dụ về cách tạo một bảng sắc độ nhất định Hệ thống sử dụng hình nền duy nhất này để tạo 5 bảng phối màu khác nhau, tạo cơ sở cho mọi giao diện sáng và tối.
Cách các biến thể màu sắc hiển thị trên thiết bị của người dùng
Người dùng có thể chọn các biến thể màu sắc từ màu được trích xuất hình nền và nhiều giao diện kể từ Android 12, với nhiều biến thể hơn được thêm vào Android 13. Ví dụ: người dùng có điện thoại Pixel chạy Android 13 sẽ chọn một biến thể trong phần cài đặt Hình nền và phong cách, như minh hoạ trong hình 4.
![](https://developer.android.com/static/develop/ui/views/theming/images/wallpaper-color.png?authuser=6&hl=vi)
Android 12 đã thêm biến thể Tonal Spot, sau đó là các biến thể Static (Trung lập), Vibrant Tonal (Tông màu Vibrant) và Biểu thức trong Android 13. Mỗi biến thể có một công thức riêng để biến đổi màu gốc của hình nền mà người dùng sử dụng thông qua sự sống động và xoay màu. Ví dụ sau đây cho thấy một bảng phối màu duy nhất được thể hiện thông qua 4 biến thể màu này.
![](https://developer.android.com/static/develop/ui/views/theming/images/color-variants-example.png?authuser=6&hl=vi)
Ứng dụng của bạn vẫn dùng các mã thông báo tương tự để truy cập vào các màu này. Để biết thông tin chi tiết về mã thông báo, hãy xem phần Tạo giao diện bằng mã thông báo trên trang này.
Làm quen với Compose
Nếu bạn đang xây dựng giao diện người dùng bằng Compose, hãy xem phần Tuỳ chỉnh giao diện Material trong Compose để biết thông tin chi tiết về cách áp dụng Màu động cho ứng dụng.
Bắt đầu sử dụng Chế độ xem
Bạn có thể áp dụng Màu động ở cấp ứng dụng hoặc hoạt động. Để thực hiện việc này, hãy gọi applyToActivitiesIfAvailable()
để đăng ký ActivityLifeCycleCallbacks
cho ứng dụng của bạn.
Kotlin
class MyApplication: Application() { override fun onCreate() { DynamicColors.applyToActivitiesIfAvailable(this) } }
Java
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); DynamicColors.applyToActivitiesIfAvailable(this); } }
Tiếp theo, hãy thêm giao diện vào ứng dụng của bạn.
<style
name="AppTheme"
parent="ThemeOverlay.Material3.DynamicColors.DayNight">
...
</style>
Tạo giao diện bằng mã thông báo
Màu động tận dụng mã thông báo thiết kế để giúp việc chỉ định màu cho các thành phần khác nhau trên giao diện người dùng trở nên đơn giản và nhất quán hơn. Mã thông báo thiết kế cho phép bạn chỉ định vai trò của màu sắc theo ngữ nghĩa thay vì giá trị đã đặt, cho các phần tử khác nhau trên giao diện người dùng. Điều này giúp hệ thống sắc độ của ứng dụng trở nên linh hoạt hơn, có thể mở rộng và nhất quán hơn, đồng thời đặc biệt mạnh mẽ khi thiết kế các giao diện sáng, tối và màu động.
Các đoạn mã sau đây cho thấy ví dụ về giao diện sáng và tối, cũng như tệp xml màu tương ứng sau khi áp dụng mã thông báo màu động.
Giao diện sáng
Themes.xml
<resources>
<style name="AppTheme" parent="Theme.Material3.Light.NoActionBar">
<item name="colorPrimary">@color/md_theme_light_primary</item>
<item name="colorOnPrimary">@color/md_theme_light_onPrimary</item>
<item name="colorPrimaryContainer">@color/md_theme_light_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/md_theme_light_onPrimaryContainer</item>
<item name="colorError">@color/md_theme_light_error</item>
<item name="colorOnError">@color/md_theme_light_onError</item>
<item name="colorErrorContainer">@color/md_theme_light_errorContainer</item>
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
<item name="colorSurface">@color/md_theme_light_surface</item>
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
…..
</style>
</resources>
Giao diện tối
Themes.xml
<resources>
<style name="AppTheme" parent="Theme.Material3.Dark.NoActionBar">
<item name="colorPrimary">@color/md_theme_dark_primary</item>
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/md_theme_dark_onPrimaryContainer</item>
<item name="colorError">@color/md_theme_dark_error</item>
<item name="colorOnError">@color/md_theme_dark_onError</item>
<item name="colorErrorContainer">@color/md_theme_dark_errorContainer</item>
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
<item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
<item name="colorSurface">@color/md_theme_dark_surface</item>
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
……
</style>
</resources>
xml màu
Colors.xml
<resources>
<color name="md_theme_light_primary">#6750A4</color>
<color name="md_theme_light_onPrimary">#FFFFFF</color>
<color name="md_theme_light_primaryContainer">#EADDFF</color>
<color name="md_theme_light_onPrimaryContainer">#21005D</color>
<color name="md_theme_light_error">#B3261E</color>
<color name="md_theme_light_onError">#FFFFFF</color>
<color name="md_theme_light_errorContainer">#F9DEDC</color>
<color name="md_theme_light_onErrorContainer">#410E0B</color>
<color name="md_theme_light_surface">#FFFBFE</color>
<color name="md_theme_light_onSurface">#1C1B1F</color>
<color name="md_theme_light_surfaceVariant">#E7E0EC</color>
<color name="md_theme_dark_primary">#D0BCFF</color>
<color name="md_theme_dark_onPrimary">#381E72</color>
<color name="md_theme_dark_primaryContainer">#4F378B</color>
<color name="md_theme_dark_onPrimaryContainer">#EADDFF</color>
<color name="md_theme_dark_secondary">#CCC2DC</color>
<color name="md_theme_dark_onSecondary">#332D41</color>
<color name="md_theme_dark_secondaryContainer">#4A4458</color>
<color name="md_theme_dark_onSurface">#E6E1E5</color>
<color name="md_theme_dark_surfaceVariant">#49454F</color>
</resources>
Thông tin khác:
Để tìm hiểu thêm về Màu động, màu tuỳ chỉnh và cách tạo mã thông báo, hãy xem trang Màu động của Material 3.
Để tạo bảng màu cơ bản cũng như màu và giao diện của ứng dụng, vui lòng dùng công cụ Material Theme Builder (Trình tạo giao diện Material) có sẵn thông qua trình bổ trợ Figma hoặc trong trình duyệt).
Để tìm hiểu thêm về việc việc sử dụng bảng phối màu có thể giúp tăng khả năng hỗ trợ tiếp cận trong ứng dụng của bạn như thế nào, hãy xem trang về Hỗ trợ tiếp cận của hệ thống màu trong Material 3.
Giữ lại màu sắc tuỳ chỉnh hoặc màu sắc của thương hiệu
Nếu ứng dụng của bạn có màu tuỳ chỉnh hoặc màu thương hiệu mà bạn không muốn thay đổi theo lựa chọn ưu tiên của người dùng, thì bạn có thể thêm từng màu khi xây dựng bảng phối màu. Ví dụ:
Themes.xml
<resources>
<style name="AppTheme" parent="Theme.Material3.Light.NoActionBar">
...
<item name="home_lamp">@color/home_yellow</item>
...
</style>
</resources>
Colors.xml
<resources>
<color name="home_yellow">#E8D655</color>
</resources>
Ngoài ra, bạn có thể sử dụng Material Theme Builder (Trình tạo giao diện Material) để nhập thêm các màu giúp mở rộng bảng phối màu, từ đó tạo ra một hệ thống màu hợp nhất.
Với tuỳ chọn này, hãy sử dụng HarmonizedColors
để chuyển tông màu của các màu tuỳ chỉnh. Điều này giúp đạt được sự cân bằng về hình ảnh và độ tương phản dễ tiếp cận khi được kết hợp với các màu do người dùng tạo. Sự cố này xảy ra trong thời gian chạy với applyToContextIfAvailable()
.
![](https://developer.android.com/static/develop/ui/views/theming/images/harmonize.png?authuser=6&hl=vi)
Xem hướng dẫn của Material 3 về cách hài hoà màu sắc tuỳ chỉnh.
Áp dụng Màu động cho các biểu tượng và tiện ích thích ứng
![](https://developer.android.com/static/develop/ui/views/theming/images/dynamic-color-icons-widgets.png?authuser=6&hl=vi)
Ngoài việc bật giao diện Màu động trên ứng dụng, bạn cũng có thể hỗ trợ tuỳ chỉnh giao diện Màu động cho các tiện ích kể từ Android 12 và cho các biểu tượng thích ứng kể từ Android 13.