หากต้องการปรับแต่งแถบระบบ ให้ใช้การกำหนดค่า XML และโมดูล Dagger ร่วมกันกับคอมโพเนนต์ UI
กำหนดลักษณะการทำงานของแถบระบบ
หากต้องการกำหนดแถบระบบ ให้ใช้แท็ก <SystemBar> ในไฟล์ XML เพื่อกำหนด
ลักษณะที่ปรากฏและภาพเคลื่อนไหว ไฟล์ XML นี้เป็นส่วนหนึ่งของการซ้อนทับทรัพยากรรันไทม์ (RRO)
แอตทริบิวต์แท็ก SystemBar
องค์ประกอบรูทสำหรับการกำหนดค่าแถบระบบคือ <SystemBar> ซึ่งรองรับ
แอตทริบิวต์ต่อไปนี้
| แอตทริบิวต์ | สถานะ | คำอธิบาย |
|---|---|---|
id |
ต้องระบุ | รหัสทรัพยากรที่ไม่ซ้ำกันสำหรับแถบระบบ เช่น
@id/my_custom_status_bar |
type |
ต้องระบุ | ระบุประเภทของแถบระบบ ซึ่งอาจเป็น
status หรือ navigation |
barZOrder |
ต้องระบุ | จำนวนเต็มที่แสดงลำดับ Z ของแถบระบบ ค่าที่สูงขึ้น แสดงว่าระบบจะวาดแถบไว้ด้านบนของแถบอื่นๆ ต้องเป็นจำนวนเต็มบวก โดยมีกฎดังนี้
|
defaultVariant |
ต้องระบุ | รหัสของ <Variant> ที่ใช้โดยค่าเริ่มต้นเมื่อ
เริ่มต้นแถบระบบ |
displayId |
ไม่บังคับ | รหัสของ <Variant> ที่ใช้โดยค่าเริ่มต้นเมื่อ
เริ่มต้นแถบระบบ |
hideForKeyboard |
ไม่บังคับ |
ค่าบูลีน เมื่อแอตทริบิวต์นี้เป็น |
dragOpenNotification |
ไม่บังคับ |
ค่าบูลีน |
dragCloseNotification |
ไม่บังคับ |
ค่าบูลีน |
รหัสและประเภทแถบระบบ
หลีกเลี่ยงการใช้ TopCarSystemBar, BottomCarSystemBar, LeftCarSystemBar และ RightCarSystemBar เป็นค่า id เนื่องจากระบบสงวนรหัสเหล่านี้ไว้เพื่อความเข้ากันได้แบบย้อนหลัง และการใช้รหัสเหล่านี้อาจทำให้เกิดลักษณะการทำงานที่ไม่คาดคิด
สำหรับการกำหนดค่าแถบสถานะด้านบนและแถบการนำทางด้านล่างพื้นฐาน ให้ใช้ status และ nav ตามลำดับเป็นค่าแอตทริบิวต์ type
หากใช้รหัสเหล่านี้ คุณสามารถข้ามส่วนที่ชื่อว่า ระบุ UI ของแถบระบบด้วย Dagger ได้
<Variant>- กำหนดสถานะภาพ ดูข้อมูลเพิ่มเติมได้ที่ใช้ตัวแปรในการ
ออกแบบสถานะภาพ กำหนดแท็ก
<Variant>อย่างน้อย 1 รายการในแท็ก<SystemBar>โดยแต่ละตัวแปรจะแสดงสถานะภาพที่แตกต่างกันและมีพร็อพเพอร์ตี้ที่ควบคุมลักษณะที่ปรากฏของแถบระบบในสถานะนั้นๆ <Visibility isVisible="true|false">- ควบคุมระดับการมองเห็นของแถบระบบ ค่าบูลีน
isVisibleจะส่งสัญญาณว่าแถบระบบมองเห็นได้หรือไม่ <Alpha alpha="float_value">- ควบคุมความโปร่งใสของแถบระบบ ค่า
alphaจะลอยอยู่ระหว่าง0.0(โปร่งใสทั้งหมด) กับ1.0(ทึบแสงทั้งหมด) <Bounds .../>กำหนดตำแหน่งและขนาดของแถบระบบ สำหรับองค์ประกอบ
<SystemBar>ขอบเขต ต้อง สัมผัสขอบอย่างน้อย 1 ด้านของจอแสดงผล (ซ้าย บน ขวา หรือล่าง) แอตทริบิวต์มีดังนี้left,top,right,bottom: พิกัดสัมบูรณ์width,height: ขนาดleftOffset,topOffset,rightOffset,bottomOffset: ออฟเซ็ตเข้าสู่กึ่งกลางของสี่เหลี่ยมผืนผ้า
<Corner radius="dimen"/>กำหนดรัศมีมุมของแถบระบบ สำหรับ
radiusให้ป้อนขนาดของรัศมีมุม<Insets .../>กำหนดระยะขอบสำหรับแถบระบบ แอตทริบิวต์คือ
left,top,rightและbottomสำหรับแต่ละแอตทริบิวต์ ให้ป้อนค่ามิติข้อมูลสำหรับระยะขอบ<Gravity .../>กำหนดแรงโน้มถ่วงของเนื้อหาในแถบระบบ ดูข้อมูลเพิ่มเติมได้ที่
HunTagXmlParserKt.GRAVITY_TAGในซอร์สโค้ด- เมื่อคุณละเว้นค่าแรงโน้มถ่วง ระบบจะคำนวณค่าดังกล่าวภายใน
- ค่าที่รองรับคือการผสมผสานระหว่าง
TOP,BOTTOM,LEFT,RIGHT,CENTER,CENTER_HORIZONTAL,CENTER_VERTICAL, และFILL_HORIZONTAL, โดยคั่นแต่ละค่าด้วยอักขระ|
หน่วยมิติข้อมูล
ระบุขนาดด้วย px, dp (หรือ dip), % หรือการอ้างอิงถึงทรัพยากร dimension, integer, fraction, string หรือ attribute
การเปลี่ยน: สร้างภาพเคลื่อนไหวระหว่างตัวแปร
ดูข้อมูลเพิ่มเติมได้ที่กำหนดค่าการเปลี่ยนผ่าน ใช้บล็อก <Transitions> เพื่อ
กำหนดวิธีที่แถบระบบจะสร้างภาพเคลื่อนไหวระหว่างตัวแปรต่างๆ
| รายการ | แอตทริบิวต์แท็ก |
|---|---|
<Transition> |
fromVariant, toVariant, onEvent, onEventTokens, animator, duration, delay, interpolator |
<Transitions> |
defaultDuration, defaultInterpolator |
UI ที่ปรับขนาดได้รองรับการเปลี่ยนในแถบระบบเฉพาะเมื่อคุณกำหนดการเปลี่ยนสำหรับกรณีการใช้งานโหมดที่ไม่เต็มหน้าจอ ซึ่งหมายความว่าโหมดเต็มหน้าจอจะไม่ทริกเกอร์การเปลี่ยนหน้าต่าง UI ที่ปรับขนาดได้สำหรับแถบระบบเมื่อซ่อน (หรือแสดง) แถบระบบ
UI ที่ปรับขนาดได้จะส่งเหตุการณ์สำหรับการซ่อน (หรือแสดง) แถบระบบต่อไปเพื่อให้แผงอื่นๆ ตอบสนองได้ตามต้องการ ขณะที่ต้องมีการเปลี่ยนสำหรับการซ่อนและแสดงแถบระบบเพื่อให้แอตทริบิวต์ hideForKeyboard ทำงานได้อย่างถูกต้อง ลองดูโครงสร้าง XML ตัวอย่างนี้
<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>
ระบุ UI ของแถบระบบด้วย Dagger
หลังจากกำหนดแถบระบบใน XML แล้ว ให้ระบุ View และ Window จริง
โดยใช้การลบล้างแอปพลิเคชันกับโมดูล Dagger เริ่มต้น CarSystemBarModule.java เช่น
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
);
}
}
สร้างโมดูล Dagger ในการลบล้าง SystemUI
หากต้องการขยายทรัพยากรเลย์เอาต์ที่กำหนดเอง ให้ใช้คลาส CarSystemBarViewSupplierUsingLayout และ CarSystemBarWindowSupplierUsingLayout
สร้างโมดูล Dagger เพื่อระบุซัพพลายเออร์ที่กำหนดเอง @StringKey ต้อง
ตรงกับ id ในแท็ก <SystemBar> XML
หากต้องการลบล้าง CarSystemBarModule ให้ดูตัวอย่างโค้ดนี้
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
);
}
}
ใช้ RRO เพื่อสร้างการกำหนดค่าระดับระบบ
ตั้งค่าการกำหนดค่าระดับระบบหลายรายการที่ส่งผลต่อแถบระบบในไฟล์ res/values/config.xml ใน RRO
ปิดใช้แถบระบบเวอร์ชันเดิม
หากต้องการป้องกันความขัดแย้งกับ UI ที่ปรับขนาดได้ ให้ปิดใช้การกำหนดค่าแถบระบบเวอร์ชันเดิมโดยตั้งค่าสถานะต่อไปนี้เป็น 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>
ตำแหน่งตัวบ่งชี้ความเป็นส่วนตัว
ทรัพยากรสตริง config_privacyIndicatorLocation จะระบุแถบระบบที่โฮสต์ตัวบ่งชี้ความเป็นส่วนตัว ค่าต้องเป็นชื่อ id ของ <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>
Listener เหตุการณ์การลาก
การกำหนดค่าเหล่านี้จะระบุแถบระบบที่รอให้เหตุการณ์การลากเกิดขึ้น (เช่น ปัดลงเพื่อเปิดแผงการแจ้งเตือน) ตั้งแต่ Android Automotive OS ที่มี UI ที่ปรับขนาดได้ ให้ใช้แอตทริบิวต์ XML เป็นค่าเริ่มต้นแทนอาร์เรย์ทรัพยากรการค้นพบที่ขับเคลื่อนด้วยข้อมูลเพื่อกำหนดความสามารถเหล่านี้
แนะนำ: การค้นพบที่ขับเคลื่อนด้วย XML (UI ที่ปรับขนาดได้)
ใช้แอตทริบิวต์ dragOpenNotification และ dragCloseNotification โดยตรง
ในแท็ก <SystemBar> ภายใน XML การวางซ้อน
<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>
เวอร์ชันเดิม: อาร์เรย์ทรัพยากร (การสำรองข้อมูล)
หากคุณดูแลรักษาบิลด์ UI ที่ไม่ปรับขนาดได้หรือต้องระบุ Listener สำหรับอุปกรณ์ที่เข้ากันได้แบบย้อนหลัง ให้ใช้แนวทาง string-array เวอร์ชันเดิมใน res/values/config.xml ใน RRO ทรัพยากร string-array เหล่านี้จะระบุแถบระบบที่รอให้เหตุการณ์การลากเกิดขึ้น เช่น เพื่อเปิดแผงการแจ้งเตือน โดย <item> แต่ละรายการคือชื่อ id ของแถบระบบ
config_registerHvacDragCloseListenerconfig_notificationDragOpenListenerconfig_notificationDragCloseListener
เช่น
<resources>
<string-array name="config_notificationDragOpenListener" translatable="false">
<item>my_custom_status_bar</item>
</string-array>
</resources>
สร้างและติดตั้งใช้งาน
วิธีสร้างและติดตั้งใช้งานแถบสถานะ
แฟลชอุปกรณ์ด้วยแอปพลิเคชันการลบล้าง SystemUI ที่แก้ไขแล้ว
ใช้ระบบบิลด์ Android (
m) เพื่อคอมไพล์โปรเจ็กต์ RROติดตั้งใช้งาน RRO APK ที่สร้างขึ้นในอุปกรณ์ Android Automotive ใช้
adb installหรือแฟลชบิลด์แบบเต็มที่มี RRO