Để tuỳ chỉnh các thanh hệ thống, hãy kết hợp cấu hình XML và các mô-đun Dagger cho các thành phần giao diện người dùng.
Xác định hành vi của thanh hệ thống
Để xác định một thanh hệ thống, hãy dùng thẻ <SystemBar> trong tệp XML để xác định giao diện và ảnh động. Tệp XML này là một phần của lớp phủ tài nguyên thời gian chạy (RRO).
Thuộc tính thẻ SystemBar
Phần tử gốc cho cấu hình thanh hệ thống là <SystemBar>, hỗ trợ các thuộc tính sau:
| Thuộc tính | Trạng thái | Mô tả |
|---|---|---|
id |
Bắt buộc | Mã nhận dạng tài nguyên duy nhất cho thanh hệ thống. Ví dụ: @id/my_custom_status_bar |
type |
Bắt buộc | Chỉ định loại thanh hệ thống, có thể là status hoặc navigation |
barZOrder |
Bắt buộc | Số nguyên biểu thị thứ tự Z của thanh hệ thống. Giá trị càng cao thì hệ thống càng vẽ thanh này lên trên các thanh khác. Phải là một số nguyên dương. Các quy tắc sau đây được áp dụng:
|
defaultVariant |
Bắt buộc | Mã nhận dạng của <Variant> được áp dụng theo mặc định khi thanh hệ thống được khởi tạo |
displayId |
Không bắt buộc | Mã nhận dạng của <Variant> được áp dụng theo mặc định khi thanh hệ thống được khởi tạo |
hideForKeyboard |
Không bắt buộc |
Giá trị Boolean là Khi thuộc tính này là |
dragOpenNotification |
Không bắt buộc |
Giá trị boolean là |
dragCloseNotification |
Không bắt buộc |
Giá trị boolean là |
Mã và loại thanh hệ thống
Tránh sử dụng TopCarSystemBar, BottomCarSystemBar, LeftCarSystemBar và RightCarSystemBar làm giá trị id. Hệ thống dành riêng các mã nhận dạng này cho khả năng tương thích ngược và việc sử dụng các mã nhận dạng này có thể dẫn đến hành vi không mong muốn.
Đối với cấu hình cơ bản của thanh trạng thái trên cùng và thanh điều hướng dưới cùng, hãy sử dụng status và nav tương ứng làm giá trị thuộc tính type.
Nếu sử dụng các mã nhận dạng này, bạn có thể bỏ qua phần có tiêu đề Cung cấp giao diện người dùng thanh hệ thống bằng Dagger.
<Variant>- Xác định các trạng thái trực quan. Để tìm hiểu thêm, hãy xem phần Sử dụng biến thể để thiết kế trạng thái trực quan. Trong thẻ
<SystemBar>, hãy xác định một hoặc nhiều thẻ<Variant>. Mỗi biến thể đại diện cho một trạng thái trực quan riêng biệt và chứa các thuộc tính kiểm soát giao diện của thanh hệ thống ở trạng thái đó. <Visibility isVisible="true|false">- Kiểm soát chế độ hiển thị của thanh hệ thống. Giá trị boolean
isVisiblebáo hiệu xem thanh hệ thống có hiển thị hay không. <Alpha alpha="float_value">- Kiểm soát độ trong suốt của thanh hệ thống. Giá trị cho
alphasẽ thay đổi từ0.0(trong suốt hoàn toàn) đến1.0(mờ hoàn toàn). <Bounds .../>Xác định vị trí và kích thước của thanh hệ thống. Đối với các phần tử
<SystemBar>, ranh giới phải chạm vào ít nhất một cạnh của màn hình (trái, trên cùng, phải hoặc dưới cùng). Các thuộc tính là:left,top,right,bottom: Toạ độ tuyệt đối.width,height: Kích thước.leftOffset,topOffset,rightOffset,bottomOffset: Độ lệch về phía tâm của hình chữ nhật.
<Corner radius="dimen"/>Xác định bán kính góc của thanh hệ thống. Đối với
radius, hãy nhập kích thước của bán kính góc.<Insets .../>Xác định phần lồng ghép cho thanh hệ thống. Các thuộc tính là
left,top,rightvàbottom. Đối với mỗi thuộc tính, hãy nhập một giá trị phương diện cho phần lồng ghép.<Gravity .../>Xác định trọng lực của nội dung trên thanh hệ thống. Để tìm hiểu thêm, hãy xem
HunTagXmlParserKt.GRAVITY_TAGtrong mã nguồn.- Khi bạn bỏ qua một giá trị cho trọng lực, hệ thống sẽ tính toán giá trị đó trong nội bộ.
- Các giá trị được hỗ trợ là tổ hợp của
TOP,BOTTOM,LEFT,RIGHT,CENTER,CENTER_HORIZONTAL,CENTER_VERTICALvàFILL_HORIZONTAL, mỗi giá trị được phân tách bằng ký tự|.
Đơn vị phương diện
Chỉ định kích thước bằng px, dp (hoặc dip), % hoặc các tham chiếu đến tài nguyên dimension, integer, fraction, string hoặc attribute.
Chuyển đổi: Tạo ảnh động giữa các biến thể
Để tìm hiểu thêm, hãy xem phần Định cấu hình hiệu ứng chuyển cảnh. Sử dụng khối <Transitions> để xác định cách thanh hệ thống tạo ảnh động giữa các biến thể:
| Mục | Thuộc tính thẻ |
|---|---|
<Transition> |
fromVariant, toVariant, onEvent, onEventTokens, animator, duration, delay, interpolator |
<Transitions> |
defaultDuration, defaultInterpolator |
Giao diện người dùng có thể mở rộng chỉ hỗ trợ các hiệu ứng chuyển đổi trong thanh hệ thống khi bạn xác định các hiệu ứng đó cho trường hợp sử dụng chế độ không chìm. Điều này có nghĩa là chế độ hiển thị tối đa không kích hoạt các hiệu ứng chuyển đổi cửa sổ Giao diện người dùng có thể mở rộng cho thanh hệ thống khi chế độ này ẩn (hoặc hiện) một thanh hệ thống.
Giao diện người dùng có thể mở rộng tiếp tục gửi các sự kiện để ẩn (hoặc hiện) một thanh hệ thống để các bảng điều khiển khác có thể phản hồi khi cần, trong khi các hiệu ứng chuyển đổi để ẩn và hiện thanh hệ thống phải được cung cấp để thuộc tính hideForKeyboard hoạt động đúng cách. Hãy xem xét cấu trúc XML mẫu này:
<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" hideForKeyboard="true">
<Variant id="@+id/default_variant">
<Bounds top="0px" left="0px" right="100%" height="100px"/>
<Visibility isVisible="true"/>
</Variant>
<Variant id="@+id/hidden_variant" parent="@id/default_variant">
<Visibility isVisible="false"/>
</Variant>
<Transitions>
<Transition onEvent="_System_Show_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/default_variant"/>
<Transition onEvent="_System_Hide_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/hidden_variant"/>
</Transitions>
</SystemBar>
Cung cấp giao diện người dùng thanh hệ thống bằng Dagger
Sau khi bạn xác định thanh hệ thống trong XML, hãy cung cấp View và Window thực tế.
Để làm như vậy, hãy áp dụng chế độ ghi đè ứng dụng cho mô-đun Dagger mặc định, CarSystemBarModule.java. Ví dụ:
import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
@Module
public abstract class MySystemBarModule extends CarSystemBarModule {
@Provides
@IntoMap
@StringKey("my_custom_status_bar") // Matches the <SystemBar> id
static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
return new CarSystemBarViewSupplierUsingLayout(
R.layout.my_custom_status_bar, // provisioned layout
R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
);
}
@Provides
@IntoMap
@StringKey("my_custom_status_bar") // Matches the <SystemBar> id
static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
return new CarSystemBarWindowSupplierUsingLayout(
R.layout.my_navigation_bar_window, // Can reuse existing window layouts
R.id.my_custom_bar_window // The ID that will be assigned to the window
);
}
}
Tạo mô-đun Dagger trong lệnh ghi đè SystemUI
Để tăng tài nguyên bố cục tuỳ chỉnh, hãy sử dụng các lớp CarSystemBarViewSupplierUsingLayout và CarSystemBarWindowSupplierUsingLayout.
Tạo một mô-đun Dagger để cung cấp các nhà cung cấp tuỳ chỉnh. @StringKey phải khớp với id trong thẻ XML <SystemBar>.
Để ghi đè CarSystemBarModule, hãy xem đoạn mã mẫu này:
import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
@Module
public abstract class MySystemBarModule extends CarSystemBarModule {
@Provides
@IntoMap
@StringKey("my_custom_status_bar") // Matches the <SystemBar> id
static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
return new CarSystemBarViewSupplierUsingLayout(
R.layout.my_custom_status_bar, // provisioned layout
R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
);
}
@Provides
@IntoMap
@StringKey("my_custom_status_bar") // Matches the <SystemBar> id
static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
return new CarSystemBarWindowSupplierUsingLayout(
R.layout.my_navigation_bar_window, // Can reuse existing window layouts
R.id.my_custom_bar_window // The ID that will be assigned to the window
);
}
}
Sử dụng RRO để tạo cấu hình cấp hệ thống
Đặt một số cấu hình ở cấp hệ thống ảnh hưởng đến các thanh hệ thống trong tệp res/values/config.xml trong RRO.
Tắt các thanh hệ thống cũ
Để tránh xung đột với Giao diện người dùng có thể mở rộng, hãy tắt các cấu hình thanh hệ thống cũ bằng cách đặt các cờ sau thành false:
<resources>
<bool name="config_enableTopSystemBar">false</bool>
<bool name="config_enableBottomSystemBar">false</bool>
<bool name="config_enableLeftSystemBar">false</bool>
<bool name="config_enableRightSystemBar">false</bool>
</resources>
Vị trí của chỉ báo về quyền riêng tư
Tài nguyên chuỗi config_privacyIndicatorLocation chỉ định thanh hệ thống nào lưu trữ các chỉ báo về quyền riêng tư. Giá trị phải là tên id của một <SystemBar>.
<resources>
<!-- "my_custom_status_bar" corresponds to the android:id name of a SystemBar -->
<string name="config_privacyIndicatorLocation">my_custom_status_bar</string>
</resources>
Trình nghe sự kiện kéo
Các cấu hình này chỉ định thanh hệ thống nào theo dõi các sự kiện kéo (ví dụ: vuốt xuống để mở bảng thông báo). Bắt đầu từ Android Automotive OS có Giao diện người dùng có thể mở rộng, hãy sử dụng các thuộc tính XML làm mặc định thay vì sử dụng các mảng tài nguyên khám phá dựa trên dữ liệu để xác định những chức năng này.
Đề xuất: Khám phá dựa trên XML (Giao diện người dùng có thể mở rộng)
Dùng trực tiếp các thuộc tính dragOpenNotification và dragCloseNotification trong thẻ <SystemBar> bên trong XML lớp phủ:
<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" dragOpenNotification="true">
<Variant id="@+id/default_variant">
<Bounds top="0px" left="0px" right="100%" height="100px"/>
<Visibility isVisible="true"/>
</Variant>
</SystemBar>
Cũ: Mảng tài nguyên (dự phòng)
Nếu bạn đang duy trì bản dựng Giao diện người dùng không thể mở rộng hoặc cần chỉ định các trình nghe cho các thiết bị tương thích ngược, hãy sử dụng phương pháp string-array cũ trong res/values/config.xml trong RRO. Các tài nguyên string-array này chỉ định thanh hệ thống nào theo dõi các sự kiện kéo. Ví dụ: để mở bảng thông báo. Mỗi <item> là tên id của một thanh hệ thống.
config_registerHvacDragCloseListenerconfig_notificationDragOpenListenerconfig_notificationDragCloseListener
Ví dụ:
<resources>
<string-array name="config_notificationDragOpenListener" translatable="false">
<item>my_custom_status_bar</item>
</string-array>
</resources>
Xây dựng và triển khai
Cách tạo và triển khai một thanh trạng thái:
Cài đặt ROM cho thiết bị bằng ứng dụng ghi đè SystemUI đã sửa đổi.
Sử dụng hệ thống xây dựng Android (
m) để biên dịch dự án RRO.Triển khai APK RRO đã tạo cho thiết bị Android Automotive. Sử dụng
adb installhoặc flash một bản dựng đầy đủ bao gồm RRO của bạn.