Per personalizzare le barre di sistema, utilizza una combinazione di configurazioni XML e moduli Dagger per i componenti dell'interfaccia utente.
Definire il comportamento della barra di sistema
Per definire una barra di sistema, utilizza il tag <SystemBar> in un file XML per definire l'
aspetto e l'animazione. Questo file XML fa parte di una sovrapposizione di risorse di runtime (RRO).
Attributi del tag SystemBar
L'elemento principale per una configurazione della barra di sistema è <SystemBar>, che supporta
i seguenti attributi:
| Attributo | Stato | Descrizione |
|---|---|---|
id |
Obbligatorio | ID risorsa univoco per la barra di sistema. Ad esempio,
@id/my_custom_status_bar |
type |
Obbligatorio | Specifica il tipo di barra di sistema, che può essere
status o navigation |
barZOrder |
Obbligatorio | Numero intero che rappresenta l'ordine Z della barra di sistema. Valori più alti indicano che il sistema disegna la barra sopra le altre. Deve essere un numero intero positivo. Si applicano le seguenti regole:
|
defaultVariant |
Obbligatorio | ID di <Variant> che si applica per impostazione predefinita quando
la barra di sistema viene inizializzata |
displayId |
Facoltativo | ID di <Variant> che si applica per impostazione predefinita quando
la barra di sistema viene inizializzata |
hideForKeyboard |
Facoltativo |
Valore booleano Quando questo attributo è |
dragOpenNotification |
Facoltativo |
Valore booleano |
dragCloseNotification |
Facoltativo |
Valore booleano |
ID e tipi di barre di sistema
Evita di utilizzare TopCarSystemBar, BottomCarSystemBar, LeftCarSystemBar e RightCarSystemBar come valori id. Il sistema riserva questi ID per la compatibilità con le versioni precedenti e il loro utilizzo potrebbe comportare un comportamento imprevisto.
Per le configurazioni di base della barra di stato superiore e della barra di navigazione inferiore, utilizza rispettivamente status e nav come valori dell'attributo type.
Se utilizzi questi ID, puoi saltare la sezione intitolata Fornire un'interfaccia utente della barra di sistema con Dagger.
<Variant>- Definisce gli stati visivi. Per scoprire di più, consulta la sezione Utilizzare una variante per
progettare uno stato visivo. Nel tag
<SystemBar>, definisci uno o più<Variant>tag. Ogni variante rappresenta uno stato visivo distinto e contiene proprietà che controllano l'aspetto della barra di sistema in quello stato. <Visibility isVisible="true|false">- Controlla la visibilità della barra di sistema. Il valore booleano
isVisibleindica se la barra di sistema è visibile o meno. <Alpha alpha="float_value">- Controlla la trasparenza della barra di sistema. Il valore di
alphaè un numero mobile compreso tra0.0(completamente trasparente) e1.0(completamente opaco). <Bounds .../>Definisce la posizione e le dimensioni della barra di sistema. Per gli elementi
<SystemBar>, i limiti devono toccare almeno un bordo del display (sinistro, superiore, destro o inferiore). Gli attributi sono:left,top,right,bottom: coordinate assolute.width,height: dimensioni.leftOffset,topOffset,rightOffset,bottomOffset: offset verso il centro del rettangolo.
<Corner radius="dimen"/>Definisce il raggio dell'angolo della barra di sistema. Per
radius, inserisci la dimensione del raggio dell'angolo.<Insets .../>Definisce i margini interni per la barra di sistema. Gli attributi sono
left,top,rightebottom. Per ogni attributo, inserisci un valore di dimensione per i margini interni.<Gravity .../>Definisce la gravità dei contenuti della barra di sistema. Per scoprire di più, consulta
HunTagXmlParserKt.GRAVITY_TAGnel codice sorgente.- Quando ometti un valore per la gravità, il sistema lo calcola internamente.
- I valori supportati sono combinazioni di
TOP,BOTTOM,LEFT,RIGHT,CENTER,CENTER_HORIZONTAL,CENTER_VERTICAL, eFILL_HORIZONTAL, ognuno separato da un carattere|.
Unità di misura
Specifica le dimensioni con px, dp (o dip), % o riferimenti a risorse dimension, integer, fraction, string o attribute.
Transizioni: animare tra le varianti
Per scoprire di più, consulta la sezione Configurare una transizione. Utilizza il blocco <Transitions> per
definire come la barra di sistema anima tra le diverse varianti:
| Elemento | Attributo del tag |
|---|---|
<Transition> |
fromVariant, toVariant, onEvent, onEventTokens, animator, duration, delay, interpolator |
<Transitions> |
defaultDuration, defaultInterpolator |
L'interfaccia utente scalabile supporta le transizioni nelle barre di sistema solo quando le definisci per i casi d'uso in modalità non immersiva. Ciò significa che la modalità immersiva non attiva le transizioni di finestre dell'interfaccia utente scalabile per le barre di sistema quando nasconde (o mostra) una barra di sistema.
L'interfaccia utente scalabile continua a inviare eventi per nascondere (o mostrare) una barra di sistema in modo che altri pannelli possano rispondere in base alle esigenze, mentre le transizioni per nascondere e mostrare le barre di sistema devono essere fornite per il corretto funzionamento dell'attributo hideForKeyboard. Considera questa struttura XML di esempio:
<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>
Fornire un'interfaccia utente della barra di sistema con Dagger
Dopo aver definito la barra di sistema in XML, fornisci la View e la Window effettive.
Per farlo, applica un override dell'applicazione al modulo Dagger predefinito, CarSystemBarModule.java. Ad esempio:
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
);
}
}
Creare un modulo Dagger in un override di SystemUI
Per espandere le risorse di layout personalizzate, utilizza le classi CarSystemBarViewSupplierUsingLayout e CarSystemBarWindowSupplierUsingLayout.
Crea un modulo Dagger per fornire i tuoi fornitori personalizzati. Il @StringKey deve
corrispondere al id nel tag XML <SystemBar>.
Per eseguire l'override di CarSystemBarModule, consulta questo esempio di codice:
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
);
}
}
Utilizzare un RRO per creare una configurazione a livello di sistema
Imposta diverse configurazioni a livello di sistema che influiscono sulle barre di sistema nel file res/values/config.xml nel tuo RRO.
Disattivare le barre di sistema legacy
Per evitare conflitti con l'interfaccia utente scalabile, disattiva le configurazioni della barra di sistema legacy impostando i seguenti flag su 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>
Posizione dell'indicatore della privacy
La risorsa stringa config_privacyIndicatorLocation specifica quale barra di sistema ospita gli indicatori della privacy. Il valore deve essere il id nome di un <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>
Listener di eventi di trascinamento
Queste configurazioni specificano quali barre di sistema sono in ascolto degli eventi di trascinamento (ad esempio, per scorrere verso il basso per aprire il pannello delle notifiche). A partire da Android Automotive OS con l'interfaccia utente scalabile, utilizza gli attributi XML come impostazione predefinita anziché gli array di risorse di rilevamento basati su risorse per definire queste funzionalità.
Consigliato: rilevamento basato su XML (interfaccia utente scalabile)
Utilizza gli attributi dragOpenNotification e dragCloseNotification direttamente
nel tag <SystemBar> all'interno dell'XML di overlay:
<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>
Legacy: array di risorse (fallback)
Se gestisci una build dell'interfaccia utente non scalabile o devi specificare i listener per i dispositivi compatibili con le versioni precedenti, utilizza l'approccio string-array legacy in res/values/config.xml nel tuo RRO. Queste risorse string-array specificano quali barre di sistema sono in ascolto degli eventi di trascinamento. Ad esempio, per aprire il pannello delle notifiche. Ogni <item> è il nome id di una barra di sistema.
config_registerHvacDragCloseListenerconfig_notificationDragOpenListenerconfig_notificationDragCloseListener
Ad esempio:
<resources>
<string-array name="config_notificationDragOpenListener" translatable="false">
<item>my_custom_status_bar</item>
</string-array>
</resources>
Creazione e deployment
Per creare ed eseguire il deployment di una barra di stato:
Esegui il flashing del dispositivo con l'applicazione di override di SystemUI modificata.
Utilizza il sistema di compilazione di Android (
m) per compilare il progetto RRO.Esegui il deployment dell'APK RRO generato sul tuo dispositivo Android Automotive. Utilizza
adb installo esegui il flashing di una build completa che includa il tuo RRO.