כדי להתאים אישית את סרגלי המערכת, משתמשים בשילוב של הגדרות XML ומודולים של Dagger לרכיבי ממשק המשתמש.
הגדרת ההתנהגות של סרגל המערכת
כדי להגדיר סרגל מערכת, משתמשים בתג <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, בהתאמה.
אם משתמשים במזהים האלה, אפשר לדלג על הקטע Provide a system bar UI with Dagger.
<Variant>
- מגדיר מצבים חזותיים. מידע נוסף זמין במאמר שימוש בווריאציה לעיצוב מצב חזותי. בתג
<SystemBar>, מגדירים תג<Variant>אחד או יותר. כל וריאציה מייצגת מצב חזותי נפרד ומכילה מאפיינים ששולטים במראה של סרגל המערכת במצב הזה. <Visibility isVisible="true|false">- המדיניות הזו קובעת את הרשאות הגישה לסרגל המערכת. האותות הבוליאניים
isVisibleמציינים אם סרגל המערכת גלוי או לא. <Alpha alpha="float_value">- המדיניות קובעת את השקיפות של סרגל המערכת. הערך של
alphaנע בין0.0(שקוף לחלוטין) לבין1.0(אטום לחלוטין). <Bounds .../>הגדרת המיקום והגודל של סרגל המערכת. עבור רכיבי
<SystemBar>, הגבולות חייבים לגעת לפחות בקצה אחד של המסך (שמאלי, עליון, ימני או תחתון). המאפיינים הם:-
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 |
ממשק משתמש שניתן להתאמה תומך במעברים בסרגלי המערכת רק כשמגדירים אותם לתרחישי שימוש במצב לא סוחף. כלומר, מצב המלאי לא מפעיל מעברים של חלונות בממשק משתמש שניתן לשינוי גודל עבור סרגלי מערכת כשהוא מסתיר (או מציג) סרגל מערכת.
ממשק המשתמש שניתן להתאמה ממשיך לשלוח אירועים להסתרה (או להצגה) של סרגל מערכת, כדי שחלוניות אחרות יוכלו להגיב לפי הצורך. בנוסף, צריך לספק מעברים להסתרה ולהצגה של סרגלי מערכת כדי שהמאפיין 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>
יצירת ממשק משתמש של סרגל מידע באמצעות 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 בתג ה-XML <SystemBar>.
כדי לשנות את הערך של 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.
השבתה של סרגלי מערכת מדור קודם
כדי למנוע קונפליקטים עם ממשק משתמש שניתן לשינוי גודל, צריך להשבית את ההגדרות של סרגל המערכת מדור קודם על ידי הגדרת הדגלים הבאים לערך 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>
drag event listeners
ההגדרות האלה מציינות אילו סרגלי מערכת מאזינים לאירועי גרירה (לדוגמה, כדי להחליק למטה ולפתוח את חלונית ההתראות). החל מ-Android Automotive OS עם ממשק משתמש ניתן לשינוי, צריך להשתמש במאפייני XML כברירת מחדל במקום במערכי משאבים של גילוי מבוסס-נתונים כדי להגדיר את היכולות האלה.
מומלץ: גילוי מבוסס XML (ממשק משתמש ניתן להרחבה)
משתמשים במאפיינים 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>
קודם: מערך משאבים (גיבוי)
אם אתם מתחזקים גרסת ממשק משתמש שלא ניתנת להתאמה או שאתם צריכים לציין מאזינים למכשירים שתואמים לאחור, אתם יכולים להשתמש בגישה מדור קודם 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>
פיתוח ופריסה
כדי לבנות ולפרוס שורת סטטוס:
מבצעים צריבת ROM (flash) במכשיר באמצעות אפליקציית ההחלפה של SystemUI ששיניתם.
משתמשים במערכת ה-build של Android (
m) כדי לקמפל את פרויקט ה-RRO.פורסים את קובץ ה-APK של ה-RRO שנוצר במכשיר Android Automotive. אפשר להשתמש ב-
adb installאו להפעיל build מלא שכולל את ה-RRO.