سفارشی‌سازی نوارهای سیستم

برای سفارشی‌سازی نوارهای سیستم، از ترکیبی از پیکربندی‌های 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 است.

When this attribute is true , you must provide _System_Show_Panel and _System_Hide_Panel transitions for the system bar.

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 واقعی را ارائه دهید. برای انجام این کار، یک override برنامه را روی ماژول پیش‌فرض 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>

شنوندگان رویداد را بکشید

این پیکربندی‌ها مشخص می‌کنند که کدام نوارهای سیستم به رویدادهای کشیدن (مثلاً کشیدن به پایین برای باز کردن پنل اعلان‌ها) گوش می‌دهند. با شروع از سیستم عامل Android Automotive با رابط کاربری مقیاس‌پذیر، از ویژگی‌های 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. دستگاه را با برنامه‌ی تغییر یافته‌ی SystemUI خود فلش کنید.

  2. از سیستم ساخت اندروید ( m ) برای کامپایل پروژه RRO خود استفاده کنید.

  3. فایل APK RRO تولید شده را روی دستگاه اندروید اتو خود نصب کنید. adb install استفاده کنید یا یک نسخه کامل که شامل RRO شما باشد را فلش کنید.