تخصيص أشرطة النظام

لتخصيص أشرطة النظام، استخدِم مجموعة من إعدادات XML ووحدات Dagger النمطية لمكوّنات واجهة المستخدم.

تحديد سلوك شريط النظام

لتحديد شريط نظام، استخدِم العلامة <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.

إذا كنت تستخدم هذه المعرّفات، يمكنك تخطّي القسم الذي يحمل العنوان توفير واجهة مستخدم لشريط النظام باستخدام 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 في علامة <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).

إيقاف أشرطة النظام القديمة

لمنع حدوث تعارضات مع واجهة المستخدم القابلة للتوسيع، أوقِف إعدادات شريط النظام القديمة عن طريق ضبط العلامات التالية على 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>

أدوات معالجة أحداث السحب

تحدّد هذه الإعدادات أشرطة النظام التي ترصد أحداث السحب (على سبيل المثال، لفتح لوحة الإشعارات عن طريق التمرير سريعًا للأسفل). بدءًا من 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_registerHvacDragCloseListener
  • config_notificationDragOpenListener
  • config_notificationDragCloseListener

على سبيل المثال:

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

التطوير والنشر

لتطوير شريط حالة ونشره:

  1. ثبِّت ذاكرة ROM على الجهاز باستخدام تطبيق إلغاء SystemUI المعدَّل.

  2. استخدِم نظام التصميم (m) في Android لتجميع مشروع تراكب الموارد في الوقت الفعلي (RRO).

  3. انشر ملف APK لتراكب موارد وقت التشغيل (RRO) الذي تم إنشاؤه على جهاز Android Automotive. استخدِم adb install أو ثبِّت إصدارًا كاملاً يتضمّن تراكب موارد وقت التشغيل (RRO).