Biểu tượng thích ứng duy trì hình dạng nhất quán trong thiết bị nhưng khác nhau giữa các thiết bị chỉ với một thành phần biểu tượng do nhà phát triển cung cấp. Ngoài ra, biểu tượng hỗ trợ hai lớp (nền trước và nền sau) có thể dùng cho chuyển động để mang lại trải nghiệm hình ảnh thú vị cho người dùng.
Trình triển khai thiết bị cung cấp mặt nạ thiết bị sẽ quyết định hình dạng của tất cả biểu tượng trên thiết bị. Biểu tượng này sẽ được dùng trên mọi giao diện người dùng hệ thống sử dụng Biểu tượng trình chạy (ví dụ: trình chạy, tổng quan, phần cài đặt và trang chia sẻ).
Ví dụ và nguồn
Ví dụ về mã:
platform/development/samples/AdaptiveIconSample/
Tài liệu dành cho nhà phát triển:
Mã nguồn:
platform/frameworks/base/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
Triển khai
Để thay đổi hình dạng của biểu tượng trên một nền tảng, hãy phủ một chuỗi trong framework/base/core/res/res/values/config.xml
như sau:
<!-- Specifies the path that is used by AdaptiveIconDrawable class to crop launcher icons. --> <string name="config_icon_mask" translatable="false">"M50,0L100,0 100,100 0,100 0,0z"</string>
Định dạng và cú pháp của chuỗi tuân theo W3, tiêu chuẩn SVG để định nghĩa đường dẫn. Định dạng này cho PathData cũng là định dạng mà các đối tượng có thể vẽ vectơ của Android hỗ trợ.
Đường dẫn này phải lồi và phải tuân theo vùng an toàn (66/71 = 91%) trong giới hạn khung hiển thị. Điều này được thực thi trong một trong các bài kiểm thử CTS.
Nếu bạn quyết định sử dụng hình tròn làm mặt nạ nền tảng, hãy nhớ phủ lên cả config_useRoundIcon = true. Nếu không, hãy đặt giá trị cấu hình này thành false hoặc không chỉ định giá trị cấu hình này.
Adaptive Icon API
API cho lớp AdaptiveIconDrawable
được hiển thị bên dưới:
package android.graphics.drawable; public class AdaptiveIconDrawable extends Drawable implements Drawable.Callback { method public Drawable getBackground(); method public Drawable getForeground(); method public Path getIconMask(); method public Region getSafeZone(); method public float getExtraInsetFraction(); method public int getOpacity(); method public void invalidateDrawable(Drawable); method public void scheduleDrawable(Drawable, Runnable, long); method public void setAlpha(int); method public void setColorFilter(ColorFilter); method public void setOpacity(int); method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable); }
public class Icon extends Parceleable { method public Bitmap createWithAdaptiveBitmap(); }
Triển khai tham chiếu
Bạn không cần làm gì để hiển thị biểu tượng thích ứng tĩnh trên bất kỳ nền tảng giao diện người dùng hệ thống nào. Khi PackageManager trả về một đối tượng có thể vẽ, bạn chỉ cần liên kết đối tượng đó với một ImageView. Đây là cách các biểu tượng được hiển thị trong các nền tảng Pre-O.
Về việc kết xuất hiệu ứng chuyển động động, Launcher3 (platform/packages/apps/Launcher3) sẽ có một cách triển khai tham chiếu cho biết cách đạt được hiệu ứng này trong O-MR1.
Xác nhận kết quả
Để xác thực quá trình triển khai, sau khi ghi đè mặt nạ theo ý thích, hãy xem các biểu tượng có được hiển thị chính xác trong Launcher3, Settings (Cài đặt), Overview (Tổng quan) và Settings (Cài đặt) hay không. Bạn cũng có thể chạy AdaptiveIconDrawableTest.java và AdaptiveIconMaskTest.java bên trong TestCase CTS đồ hoạ để kiểm thử quá trình triển khai.
Bạn có thể tìm thấy một trường hợp kiểm thử thủ công được đề xuất tại: platform/development/samples/AdaptiveIconSample/.
Vấn đề đã biết
Sau đây là các vấn đề đã biết:
- Biểu tượng mờ, tuỳ thuộc vào cách xác định đường dẫn mặt nạ.
- Biểu tượng lối tắt được phóng to nếu nhà phát triển ứng dụng không sử dụng phương thức
Icon.createWithAdaptiveBitmap()
hoặc không sử dụng phương thức này đúng cách. Để phương thức này hoạt động đúng cách, Bitmap được truyền vào phải được thêm khoảng đệm 25% ở cả bốn cạnh.
Bạn có thể giải quyết các vấn đề này như sau:
- Mặt nạ phải được xác định trong hệ toạ độ [0, 100] x [0, 100].
- Đảm bảo rằng hình ảnh dùng cho biểu tượng thích ứng (biểu tượng trình chạy , lối tắt) có đủ khoảng đệm (25%) ở cả bốn cạnh.