Sistem çubuklarını özelleştirme

Sistem çubuklarını özelleştirmek için XML yapılandırmaları ve Dagger modüllerinin kullanıcı arayüzü bileşenleriyle birlikte kullanın.

Sistem çubuğu davranışını tanımlama

Sistem çubuğu tanımlamak için XML dosyasında <SystemBar> etiketini kullanarak görünümü ve animasyonu tanımlayın. Bu XML dosyası, bir çalışma zamanı kaynak yerleşimi (RRO) parçasıdır.

SystemBar etiketi özellikleri

Bir sistem çubuğu yapılandırmasının kök öğesi <SystemBar>'dır ve şu özellikleri destekler:

Özellik Durum Açıklama
id Zorunlu Sistem çubuğunun benzersiz kaynak kimliği. Örneğin, @id/my_custom_status_bar
type Zorunlu Sistem çubuğunun türünü belirtir. Tür, status veya navigation olabilir.
barZOrder Zorunlu

Sistem çubuğunun Z sırasını temsil eden tam sayı. Yüksek değerler, sistemin çubuğu diğerlerinin üzerinde çizdiğini gösterir. Pozitif bir tam sayı olmalıdır. Aşağıdaki kurallar geçerlidir:

  • Bir uyarı bildirimi üzerinde sistem çubuğu gösteriyorsanız bu değer 10 değerinden büyük olmalıdır.
  • Çakışan sistem çubukları aynı Z sırasına sahip olamaz
defaultVariant Zorunlu Sistem çubuğu başlatıldığında varsayılan olarak uygulanan <Variant> kimliği
displayId İsteğe bağlı Sistem çubuğu başlatıldığında varsayılan olarak uygulanan <Variant> kimliği
hideForKeyboard İsteğe bağlı

Yazılım klavyesi etkin olduğunda sistem çubuğunun otomatik olarak gizlenip gizlenmeyeceğini belirten true veya false Boole değeri. Bu özellik varsayılan olarak false değerine ayarlanır.

Bu özellik true olduğunda sistem çubuğu için _System_Show_Panel ve _System_Hide_Panel geçişlerini sağlamanız gerekir.

dragOpenNotification İsteğe bağlı

Sistem çubuğunun bildirim panelinin açılmasını otomatik olarak tetikleyip tetiklemeyeceğini belirtmek için kullanılan true veya false Boole değeri. Bu özellik varsayılan olarak false değerine ayarlanır.

dragCloseNotification İsteğe bağlı

Sistem çubuğunun bildirim panelinin kapatılmasını otomatik olarak tetikleyip tetiklemediğini belirtmek için true veya false Boole değeri. Bu özellik varsayılan olarak false değerine ayarlanır.

Sistem çubuğu kimlikleri ve türleri

TopCarSystemBar, BottomCarSystemBar, LeftCarSystemBar ve RightCarSystemBar değerlerini id değeri olarak kullanmaktan kaçının. Sistem, bu kimlikleri geriye dönük uyumluluk için ayırır ve bunların kullanılması beklenmedik davranışlara yol açabilir.

Temel üst durum çubuğu ve alt gezinme çubuğu yapılandırmaları için sırasıyla status ve nav değerlerini type özelliği değerleri olarak kullanın.

Bu kimlikleri kullanıyorsanız Dagger ile sistem çubuğu kullanıcı arayüzü sağlama başlıklı bölümü atlayabilirsiniz.

<Variant>
Görsel durumları tanımlar. Daha fazla bilgi edinmek için Görsel durum tasarlamak için varyant kullanma başlıklı makaleyi inceleyin. <SystemBar> etiketinde bir veya daha fazla <Variant> etiketi tanımlayın. Her varyant, farklı bir görsel durumu temsil eder ve bu durumdaki sistem çubuğunun görünümünü kontrol eden özellikleri içerir.
<Visibility isVisible="true|false">
Sistem çubuğunun görünürlüğünü kontrol eder. isVisible Boole sinyalleri, sistem çubuğunun görünür olup olmadığını gösterir.
<Alpha alpha="float_value">
Sistem çubuğunun şeffaflığını kontrol eder. alpha değeri, 0.0 (tamamen şeffaf) ile 1.0 (tamamen opak) arasında değişir.
<Bounds .../>

Sistem çubuğunun konumunu ve boyutunu tanımlar. <SystemBar> öğeleri için sınırlamalar, ekranın en az bir kenarına (sol, üst, sağ veya alt) değmelidir. Özellikler şunlardır:

  • left, top, right, bottom: Mutlak koordinatlar.
  • width, height: Boyutlar.
  • leftOffset, topOffset, rightOffset, bottomOffset: Dikdörtgenin merkezine doğru uzaklıklar.
<Corner radius="dimen"/>

Sistem çubuğunun köşe yarıçapını tanımlar. radius için köşe yarıçapının boyutunu girin.

<Insets .../>

Sistem çubuğu için iç kısımları tanımlar. Özellikler left, top, right ve bottom'dür. Her özellik için iç kısımların boyut değerini girin.

<Gravity .../>

Sistem çubuğu içeriğinin yer çekimini tanımlar. Daha fazla bilgi edinmek için kaynak kodundaki HunTagXmlParserKt.GRAVITY_TAG bölümüne bakın.

  • Yer çekimi değeri atladığınızda sistem bunu dahili olarak hesaplar.
  • Desteklenen değerler TOP, BOTTOM, LEFT, RIGHT, CENTER, CENTER_HORIZONTAL, CENTER_VERTICAL ve FILL_HORIZONTAL kombinasyonlarıdır. Her biri | karakteriyle ayrılır.

Boyut birimleri

px, dp (veya dip), % ya da dimension, integer, fraction, string veya attribute kaynaklarına yapılan referanslarla boyutları belirtin.

Geçişler: Varyantlar arasında animasyon oluşturma

Daha fazla bilgi için Geçiş yapılandırma başlıklı makaleyi inceleyin. Sistem çubuğunun farklı varyantlar arasında nasıl animasyon yapacağını tanımlamak için <Transitions> bloğunu kullanın:

Öğe Etiket özelliği
<Transition> fromVariant, toVariant, onEvent, onEventTokens, animator, duration, delay, interpolator
<Transitions> defaultDuration, defaultInterpolator

Ölçeklenebilir kullanıcı arayüzü, sistem çubuklarındaki geçişleri yalnızca bunları sarmalayıcı olmayan mod kullanım alanları için tanımladığınızda destekler. Bu, tam ekran modunun bir sistem çubuğunu gizlediğinde (veya gösterdiğinde) sistem çubukları için ölçeklenebilir kullanıcı arayüzü pencere geçişlerini tetiklemediği anlamına gelir.

Ölçeklenebilir kullanıcı arayüzü, bir sistem çubuğunu gizleme (veya gösterme) etkinliklerini göndermeye devam eder. Böylece diğer paneller gerektiği gibi yanıt verebilir. hideForKeyboard özelliğinin düzgün çalışması için sistem çubuklarını gizleme ve gösterme geçişleri sağlanmalıdır. Aşağıdaki örnek XML yapısını inceleyin:

<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 ile sistem çubuğu kullanıcı arayüzü sağlama

Sistem çubuğunu XML'de tanımladıktan sonra gerçek View ve Window değerlerini sağlayın. Bunu yapmak için varsayılan Dagger modülüne uygulama geçersiz kılma işlemi uygulayın, CarSystemBarModule.java. Örneğin:

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
        );
    }
}

SystemUI geçersiz kılma işleminde Dagger modülü oluşturma

Özel düzen kaynaklarınızı genişletmek için CarSystemBarViewSupplierUsingLayout ve CarSystemBarWindowSupplierUsingLayout sınıflarını kullanın.

Özel tedarikçilerinizi sağlamak için bir Dagger modülü oluşturun. @StringKey, <SystemBar> XML etiketinizdeki id ile eşleşmelidir.

CarSystemBarModule değerini geçersiz kılmak için şu kod örneğine bakın:

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
        );
    }
}

Sistem düzeyinde yapılandırma oluşturmak için RRO kullanma

RRO'nuzdaki res/values/config.xml dosyasında sistem çubuklarını etkileyen çeşitli sistem düzeyinde yapılandırmalar ayarlayın.

Eski sistem çubuklarını devre dışı bırakma

Ölçeklenebilir kullanıcı arayüzüyle çakışmaları önlemek için aşağıdaki işaretleri false olarak ayarlayarak eski sistem çubuğu yapılandırmalarını devre dışı bırakın:

<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>

Gizlilik göstergesinin konumu

config_privacyIndicatorLocation dize kaynağı, hangi sistem çubuğunun gizlilik göstergelerine ev sahipliği yaptığını belirtir. Değer, <SystemBar> öğesinin id adı olmalıdır.

<resources>
    <!-- "my_custom_status_bar" corresponds to the android:id name of a SystemBar -->
    <string name="config_privacyIndicatorLocation">my_custom_status_bar</string>
</resources>

Sürükleme etkinliği işleyicileri

Bu yapılandırmalar, hangi sistem çubuklarının sürükleme etkinliklerini dinleyeceğini (örneğin, bildirim panelini açmak için aşağı kaydırma) belirtir. Ölçeklenebilir kullanıcı arayüzü içeren Android Automotive OS'ten itibaren bu özellikleri tanımlamak için yönlendirilen keşif kaynak dizileri yerine varsayılan olarak XML özelliklerini kullanın.

Önerilen: XML destekli keşif (ölçeklenebilir kullanıcı arayüzü)

Yer paylaşımı XML'nizdeki <SystemBar> etiketinizde doğrudan dragOpenNotification ve dragCloseNotification özelliklerini kullanın:

<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>

Eski: Kaynak dizisi (yedek)

Ölçeklenebilir olmayan bir kullanıcı arayüzü derlemesini koruyorsanız veya geriye dönük uyumlu cihazlar için dinleyiciler belirtmeniz gerekiyorsa RRO'nuzda string-array yaklaşımını kullanın.res/values/config.xml Bu string-array kaynaklar, hangi sistem çubuklarının sürükleme etkinliklerini dinleyeceğini belirtir. Örneğin, bildirim panelini açmak için. Her <item>, bir id sistem çubuğunun adıdır.

  • config_registerHvacDragCloseListener
  • config_notificationDragOpenListener
  • config_notificationDragCloseListener

Örneğin:

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

Derleme ve dağıtma

Durum çubuğu oluşturmak ve dağıtmak için:

  1. Cihazı, değiştirilmiş SystemUI geçersiz kılma uygulamanızla yükleyin.

  2. RRO projenizi derlemek için Android derleme sistemini (m) kullanın.

  3. Oluşturulan RRO APK'sını Android Automotive cihazınıza dağıtın. adb install komutunu kullanın veya RRO'nuzu içeren tam bir derleme yükleyin.