برای سفارشیسازی نوارهای سیستم، از ترکیبی از پیکربندیهای XML و ماژولهای Dagger برای اجزای رابط کاربری استفاده کنید.
تعریف رفتار نوار سیستم
برای تعریف یک نوار سیستم، از تگ <SystemBar> در یک فایل XML برای تعریف ظاهر و انیمیشن استفاده کنید. این فایل XML بخشی از یک پوشش منابع زمان اجرا (RRO) است.
ویژگیهای تگ SystemBar
عنصر ریشه برای پیکربندی نوار سیستم <SystemBar> است که از این ویژگیها پشتیبانی میکند:
| ویژگی | وضعیت | توضیحات |
|---|---|---|
id | مورد نیاز | شناسه منبع منحصر به فرد برای نوار سیستم. برای مثال، @id/my_custom_status_bar |
type | مورد نیاز | نوع نوار سیستم را مشخص میکند که میتواند status یا navigation باشد. |
barZOrder | مورد نیاز | عدد صحیح برای نمایش مرتبه Z میله سیستم. مقادیر بالاتر نشان میدهد که سیستم میله را روی بقیه رسم میکند. باید یک عدد صحیح مثبت باشد. این قوانین اعمال میشوند:
|
defaultVariant | مورد نیاز | شناسهی <Variant> که به طور پیشفرض هنگام مقداردهی اولیهی نوار سیستم اعمال میشود. |
displayId | اختیاری | شناسهی <Variant> که به طور پیشفرض هنگام مقداردهی اولیهی نوار سیستم اعمال میشود. |
hideForKeyboard | اختیاری | مقداری بولی بین When this attribute is |
dragOpenNotification | اختیاری | مقداری بولی بین |
dragCloseNotification | اختیاری | مقداری بولی از |
شناسهها و انواع نوار سیستم
از استفاده از 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>
ساخت و استقرار
برای ساخت و استقرار نوار وضعیت:
دستگاه را با برنامهی تغییر یافتهی SystemUI خود فلش کنید.
از سیستم ساخت اندروید (
m) برای کامپایل پروژه RRO خود استفاده کنید.فایل APK RRO تولید شده را روی دستگاه اندروید اتو خود نصب کنید.
adb installاستفاده کنید یا یک نسخه کامل که شامل RRO شما باشد را فلش کنید.