ปรับแต่งแถบระบบ

หากต้องการปรับแต่งแถบระบบ ให้ใช้การกำหนดค่า XML และโมดูล Dagger ร่วมกันกับคอมโพเนนต์ UI

กำหนดลักษณะการทำงานของแถบระบบ

หากต้องการกำหนดแถบระบบ ให้ใช้แท็ก <SystemBar> ในไฟล์ XML เพื่อกำหนด ลักษณะที่ปรากฏและภาพเคลื่อนไหว ไฟล์ XML นี้เป็นส่วนหนึ่งของการซ้อนทับทรัพยากรรันไทม์ (RRO)

แอตทริบิวต์แท็ก SystemBar

องค์ประกอบรูทสำหรับการกำหนดค่าแถบระบบคือ <SystemBar> ซึ่งรองรับ แอตทริบิวต์ต่อไปนี้

แอตทริบิวต์ สถานะ คำอธิบาย
id ต้องระบุ รหัสทรัพยากรที่ไม่ซ้ำกันสำหรับแถบระบบ เช่น @id/my_custom_status_bar
type ต้องระบุ ระบุประเภทของแถบระบบ ซึ่งอาจเป็น status หรือ navigation
barZOrder ต้องระบุ

จำนวนเต็มที่แสดงลำดับ Z ของแถบระบบ ค่าที่สูงขึ้น แสดงว่าระบบจะวาดแถบไว้ด้านบนของแถบอื่นๆ ต้องเป็นจำนวนเต็มบวก โดยมีกฎดังนี้

  • หากคุณแสดงแถบระบบเหนือการแจ้งเตือนแบบป๊อปอัป แล้ว ค่านี้ต้องมากกว่า 10
  • แถบระบบที่ซ้อนทับกันจะมีลำดับ Z เดียวกันไม่ได้
defaultVariant ต้องระบุ รหัสของ <Variant> ที่ใช้โดยค่าเริ่มต้นเมื่อ เริ่มต้นแถบระบบ
displayId ไม่บังคับ รหัสของ <Variant> ที่ใช้โดยค่าเริ่มต้นเมื่อ เริ่มต้นแถบระบบ
hideForKeyboard ไม่บังคับ

ค่าบูลีน true หรือ false เพื่อระบุว่าแถบระบบจะซ่อนโดยอัตโนมัติเมื่อแป้นพิมพ์เสมือนทำงานอยู่หรือไม่ แอตทริบิวต์นี้มีค่าเริ่มต้นเป็น false

เมื่อแอตทริบิวต์นี้เป็น true คุณต้องระบุ _System_Show_Panel และ _System_Hide_Panel การเปลี่ยนสำหรับแถบระบบ

dragOpenNotification ไม่บังคับ

ค่าบูลีน true หรือ false เพื่อระบุ ว่าแถบระบบจะทริกเกอร์การเปิดแผงการแจ้งเตือนโดยอัตโนมัติหรือไม่ แอตทริบิวต์นี้มีค่าเริ่มต้นเป็น false

dragCloseNotification ไม่บังคับ

ค่าบูลีน true หรือ false เพื่อระบุ ว่าแถบระบบจะทริกเกอร์การปิดแผงการแจ้งเตือนโดยอัตโนมัติหรือไม่ แอตทริบิวต์นี้มีค่าเริ่มต้นเป็น false

รหัสและประเภทแถบระบบ

หลีกเลี่ยงการใช้ 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_registerHvacDragCloseListener
  • config_notificationDragOpenListener
  • config_notificationDragCloseListener

เช่น

<resources>
    <string-array name="config_notificationDragOpenListener" translatable="false">
        <item>my_custom_status_bar</item>
    </string-array>
</resources>

สร้างและติดตั้งใช้งาน

วิธีสร้างและติดตั้งใช้งานแถบสถานะ

  1. แฟลชอุปกรณ์ด้วยแอปพลิเคชันการลบล้าง SystemUI ที่แก้ไขแล้ว

  2. ใช้ระบบบิลด์ Android (m) เพื่อคอมไพล์โปรเจ็กต์ RRO

  3. ติดตั้งใช้งาน RRO APK ที่สร้างขึ้นในอุปกรณ์ Android Automotive ใช้ adb install หรือแฟลชบิลด์แบบเต็มที่มี RRO