Materiale che progetti

A partire da Android 12, Material You Design si concentra sull'espressione e sulla fluidità del sistema operativo Android, con l'obiettivo di aiutare gli utenti a creare e possedere un'unica esperienza coesa adatta alle loro esigenze. In qualità di partner Android, sei incoraggiato a incorporare il materiale che progetti nei tuoi dispositivi Android nelle seguenti aree:

  • Colore dinamico
  • Movimento
  • Widget

Colore dinamico

Il colore dinamico è il fulcro di Material You Design e una parte fondamentale della strategia pluriennale di Android volta a offrire agli utenti una personalizzazione più semplice e profonda come nessun altro dispositivo riesce a fare. Materiale che offri:

  • Utenti e sviluppatori una storia ricca e coerente di personalizzazione disponibile in qualsiasi dispositivo Android.

  • Opportunità per gli OEM Android di continuare a innovare l'interfaccia utente del sistema e le app di prima parte in linea con il colore, la marca e la forma dell'hardware e del marchio.

Per sfruttare i vantaggi del colore dinamico, utilizza la storia dell'estrazione del colore di Android 12 Material You come parte fondamentale dell'offerta software agli utenti. Sul dispositivo, utilizza la logica di estrazione del colore presente in AOSP, in particolare la logica che accetta un singolo colore di sfondo o di origine del tema e lo restituisce tramite 65 API di colore. Per i requisiti del colore dinamico, vedere Utilizzo del colore dinamico .

Il flusso di colore dinamico completo comprende quattro passaggi, come illustrato di seguito:

Materiale che colora il flusso

Figura 1. Materiale Il flusso di colore dinamico

  1. L'utente modifica lo sfondo o il tema tramite il selettore OEM.

  2. L'utente seleziona una delle seguenti opzioni:

    • Tema del dispositivo. Se selezionato, Android seleziona automaticamente un singolo colore di origine che soddisfa i requisiti.

    • Nuovo sfondo + tema. Quando selezionata, la logica AOSP seleziona automaticamente un singolo colore sorgente dallo sfondo selezionato.

  3. AOSP espande il singolo colore sorgente in 5 tavolozze tonali con 13 varianti di colore tonali ciascuna, secondo la logica AOSP, che poi popolano i 65 attributi di colore.

  4. L'interfaccia utente dell'app utilizza i 65 attributi di colore in modo coerente nell'ecosistema delle app Android. Ti invitiamo a utilizzare la stessa tavolozza di colori per l'interfaccia utente del sistema del dispositivo e per le app specifiche dell'OEM.

Patch per Android 12

Per ottenere la logica end-to-end per l'estrazione del colore dello sfondo e consentire al dispositivo di riempire le API a 65 colori in modo coerente con l'ecosistema, includi le seguenti patch nell'implementazione di Android 12:

Specifica dei colori personalizzati in ThemePicker

Se stai utilizzando l'app AOSP ThemePicker, l'app WallpaperPicker mostra la sezione dei colori se sono soddisfatte entrambe le seguenti condizioni:

  • flag_monet su frameworks/base/packages/SystemUI/res/values/flags.xml è true .
  • Un APK stub di sistema con il nome del pacchetto è definito in themes_stub_package nel file packages/apps/ThemePicker/res/values/override.xml .

Formato APK stub

Una versione di esempio di questo APK è disponibile in packages/apps/ThemePicker/themes .

Questo APK dovrebbe contenere solo risorse, descrivendo in dettaglio i colori di base disponibili e i loro nomi.

Lo stub dovrebbe contenere un file XML sotto res/xml con il seguente formato:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="color_bundles">
        <item>color1</item>
        <item>color2</item>
        <item>color3</item>
        <item>color4</item>
    </array>

    <string name="bundle_name_color1">Blue</string>
    <string name="bundle_name_color2">Red</string>
    <string name="bundle_name_color3">Yellow</string>
    <string name="bundle_name_color4">Green</string>

</resources>

In questo file, ogni item all'interno di color_bundles ha un nome distinto, purché le stringhe seguenti siano denominate bundle_name_ item .

Dovrebbe esserci una stringa bundle_name_ item per ciascun colore, con un nome descrittivo per ciascun colore. Questi possono essere tradotti aggiungendo le stringhe tradotte corrispondenti nelle directory res/values- language code .

I valori di colore effettivi possono trovarsi sullo stesso XML o su un file XML di risorse separato con il seguente formato:

<resources>
    <color name="color_primary_color1">#0000FF</color>
    <color name="color_secondary_color1">#0000FF</color>

    <color name="color_primary_color2">#ff0000</color>
    <color name="color_secondary_color2">#ff0000</color>

    <color name="color_primary_color3">#ffff00</color>
    <color name="color_secondary_color3">#ffff00</color>

    <color name="color_primary_color4">#00ff00</color>
    <color name="color_secondary_color4">#00ff00</color>
</resources>

Per ogni elemento nell'array dei bundle di colori, dovrebbe esserci una color_primary_ item e una color_secondary_ item (ed entrambi i colori dovrebbero essere dello stesso colore). I valori per queste voci color sono i codici colore effettivi per ciascun colore da mostrare nella sezione dei colori di base .

Passaggio 1: crea un'esperienza di tematizzazione utente

Il selettore temi è il luogo in cui gli utenti interagiscono con le nuove funzionalità di personalizzazione di Material You e potenzialmente scelgono tra opzioni di colore o preimpostazioni. Poiché si adatta al tuo prodotto e ai dati demografici dell'utente, puoi offrire agli utenti un'esperienza di personalizzazione e colore più ricca attraverso l'uso di un selettore di temi o di sfondo .

  • Quando si utilizza un selettore di sfondi, l'estrazione del colore dello sfondo è attiva per impostazione predefinita. Tuttavia, puoi apportare alcune personalizzazioni al selettore per fornire più opzioni all'utente.

Passaggio 2: estrai il colore dello sfondo in un colore sorgente

Per abilitare l'estrazione del colore dello sfondo, scegli le patch Android 12 elencate sopra (questa funzionalità sarà abilitata per impostazione predefinita in una futura versione AOSP). La logica AOSP che attiva l'estrazione dello sfondo inizia da frameworks/base/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java , su ThemeOverlayController#mOnColorsChangedListener , tramite WallpaperManager#onWallpaperColorsChanged . Ti consigliamo di utilizzare la logica AOSP non modificata per garantire un'esperienza di sviluppo coerente.

Per impostazione predefinita, la logica seleziona il colore con la frequenza più alta adatto all'uso. Per sfruttare altri colori sorgente restituiti dall'algoritmo e presentare tali colori agli utenti nel selettore temi, utilizzare ColorScheme#getSeedColors(wallpaperColors: WallpaperColors) .

Per essere idoneo all'uso, un colore sorgente (estratto dallo sfondo o da una preimpostazione scelta dall'utente) deve avere un valore di crominanza CAM16 minimo pari a 5; ciò garantisce che il colore sorgente non venga influenzato da tenui toni scuri quando viene convertito da un singolo colore a 65 colori tonali e rimanga rappresentativo della scelta dell'utente. Per leggere e modificare i colori in CAM16, utilizzare Cam#fromInt o Cam#getInt .

Utilizzo di una tavolozza di colori non dinamica Per i dispositivi che non supportano l'estrazione del colore dello sfondo, puoi comunque assicurarti che le app Google e le app di terze parti che supportano il colore dinamico abbiano un bell'aspetto procedendo come segue:

  • Utilizzare la tavolozza dei materiali predefinita disabilitando flag_monet su frameworks/base/packages/SystemUI/res/values/flags.xml .
  • Assicurati che gli utenti possano comunque personalizzare il proprio sistema operativo utilizzando un selettore di temi preimpostato.

Passaggio 3: espandi il colore di origine nelle API dei colori

Utilizzando il colore sorgente singolo derivato dal passaggio precedente, Android genera 5 tavolozze tonali uniche (accento 1-3, neutro 1-2), ciascuna tavolozza include 13 colori e ciascun colore include diversi valori di luminanza (da 0 a 1000), per un totale di 65 colori. La logica fornita nelle patch di Android 12 implementa correttamente questa espansione dei colori; i dettagli forniti di seguito descrivono l'implementazione.

Per coerenza dello sviluppatore, le 5 tavolozze tonali (accent1, accent2, accent3, neutral1, neutral2) e i relativi 13 colori corrispondenti devono essere basati sul singolo colore sorgente con le rispettive modifiche ai valori di crominanza e tonalità CAM16 come scritto di seguito:

  • system_accent1

    • Chroma: usa "40" per le varianti di colori che terminano con 0 , 10 , 50 e 100 , altrimenti "48"
    • Tonalità: uguale alla fonte
  • system_accent2

    • Crominanza: usa "16"
    • Tonalità: uguale alla fonte
  • system_accent3

    • Crominanza: usa "32"
    • Tonalità: ruota di 60 gradi in positivo
  • system_neutral1

    • Crominanza: usa "4"
    • Tonalità: uguale alla fonte
  • system_neutral2

    • Crominanza: usa "8"
    • Tonalità: uguale alla fonte

CTS include test per la convalida delle chiamate API di luminanza e tonalità. Per eseguire, utilizzare atest SystemPalette .

Passaggio 4: utilizza i colori dinamici nelle app e nell'interfaccia utente del sistema

Dopo aver impostato i colori dinamici su un dispositivo, le app seguono le linee guida sui materiali per utilizzare i colori. Le linee guida sui materiali dovrebbero essere rilasciate su material.io entro il 26 ottobre 2021 per l'adozione da parte di app di terze parti. Per l'interfaccia utente di sistema e le app proprietarie, consigliamo vivamente di integrare colori dinamici nell'intera esperienza utente in modo che si adattino al tuo hardware e al tuo marchio e ti aiutino a differenziare i tuoi dispositivi.

Per indicazioni generali sul colore dinamico, vedere quanto segue:

  • Utilizza i colori principali per gli elementi in primo piano nelle app e nell'interfaccia utente del sistema:

    @android:color/system_accent1_0 … 1000 // most-used foreground color group
    @android:color/system_accent2_0 … 1000 // alternate accent, used for surfaces
    @android:color/system_accent3_0 … 1000 // playful, analogous color
    
  • Utilizza colori neutri per gli elementi di sfondo nelle app e nell'interfaccia utente del sistema:

    @android:color/system_neutral1_0 … 1000 // most-used background color group
    @android:color/system_neutral2_0 … 1000 // used for higher-elevation surfaces
    

Per ulteriori informazioni su come Material You mappa i colori e su come vengono utilizzate le API in SysUI, consulta Risorse aggiuntive .

Passaggio 5: aggiungi opzioni di colore dinamico nella tua implementazione AOSP WallpaperPicker

Crea per Android 13 e versioni successive

A partire da Android 13, android.theme.customization.accent_color è deprecato. Viene aggiunto un nuovo attributo android.theme.customization.theme_style per supportare diverse varianti di colore. Al momento abbiamo quattro varianti nel codice base come segue:

TONAL_SPOT = Default Material You theme since Android S.
VIBRANT = Theme where accent 2 and 3 are analogous to accent 1.
EXPRESSIVE = Highly chromatic theme.
SPRITZ = Desaturated theme, almost grayscale.

Questi vengono inviati a Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES , come mostrato nel JSON di seguito:

{
    "android.theme.customization.system_palette":"B1611C",
    "android.theme.customization.theme_style":"EXPRESSIVE"
}

Crea per Android 12 e versioni precedenti

Quando si utilizza un selettore di temi personalizzato, il dispositivo deve inviare un colore di origine valido a Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES fornendo un file JSON nel seguente formato (dove 746BC1 è un esempio di colore di origine valido):

{
      "android.theme.customization.system_palette":"746BC1",
      "android.theme.customization.accent_color":"746BC1"
}

In questo modo si salta l'estrazione del colore dello sfondo (passaggio 2) ed si espande direttamente il colore sorgente fornito in 65 attributi di colore (passaggio 3).

Passaggio 6: invia un ticket

Oltre all'integrazione del sistema, devi compilare un ticket e comunicarci il nome del tuo marchio ( Build.MANUFACTURER ). Poiché la maggior parte delle app di terze parti utilizza i componenti materiali per Android per mostrare i colori dinamici, utilizziamo una lista consentita codificata per indicare quali dispositivi hanno integrato la funzionalità delle tavolozze tonali dei colori dinamici .

Movimento

Il movimento fluido rende i dispositivi moderni e premium. Per creare e mantenere la fiducia e la felicità degli sviluppatori, l'overscroll e l'ondulazione sono due parti fondamentali del movimento fluido che devono apparire coerenti.

Utilizzo dell'overscroll nel sistema operativo

Android 12 include un movimento di overscroll più reattivo e dinamico sotto forma di un allungamento della vista, mostrato quando l'utente tenta di scorrere oltre il bordo di un elenco. Un esempio è mostrato di seguito:

Materiale che superi lo scorrimento

Figura 2. Effetto overscroll di Android 12, come mostrato in Impostazioni

Per garantire coerenza agli sviluppatori, assicurati che l'effetto di overscroll complessivo sui tuoi dispositivi sia simile al seguente:

  • Sui dispositivi che restituiscono true per ActivityManager.isHighEndGfx() , l'effetto di scorrimento eccessivo è un allungamento non lineare dello schermo (come mostrato sopra).

  • Sui dispositivi con prestazioni inferiori, l'effetto di allungamento è semplificato in un allungamento lineare (per ridurre il carico sul sistema).

Utilizzo dello scorrimento eccessivo nelle app proprietarie

Quando utilizzi visualizzazioni personalizzate, potrebbe essere necessario modificare alcune app e l'interfaccia utente di sistema che utilizzano l'effetto allungamento.

  • Per supportare l'overscroll esteso, esegui l'aggiornamento alle librerie più recenti:

    • androidx.recyclerview:recyclerview:1.3.0-alpha01 per RecyclerView
    • androidx.core:core:1.7.0-alpha01 per NestedScrollView e EdgeEffectCompat
    • androidx.viewpager:viewpager:1.1-alpha01 per ViewPager
  • Per i layout personalizzati che utilizzano EdgeEffect , considera le seguenti modifiche UX:

    • Con l'overscorrimento allungato, gli utenti non devono interagire con i contenuti del layout mentre viene allungato. Gli utenti dovrebbero manipolare solo l'estensione stessa e non, ad esempio, essere in grado di premere un pulsante nel contenuto.

    • Quando gli utenti toccano il contenuto mentre è in corso l'animazione EdgeEffect , dovrebbero catturare l'animazione e poter manipolare l'allungamento. Il valore pull corrente è disponibile da EdgeEffectCompat.getDistance() .

    • Per manipolare il valore pull e restituire l'importo consumato, utilizzare onPullDistance() . Ciò consente agli sviluppatori di passare agevolmente dall'allungamento allo scorrimento mentre il dito estende il contenuto oltre la posizione iniziale.

    • Quando si lavora con lo scorrimento annidato, se il contenuto è allungato, l'allungamento dovrebbe consumare il movimento del tocco prima del contenuto annidato, altrimenti l'annidamento potrebbe scorrere quando il dito cambia direzione invece di rilasciare l'allungamento.

Per i dettagli sullo scorrimento eccessivo, fare riferimento a Animare un gesto di scorrimento .

Utilizzo dell'ondulazione (feedback tattile) nel tuo sistema operativo

Android 12 include un'ondulazione del tocco più morbida e sottile per fornire feedback agli utenti quando toccano.

Materiale che increspa

Figura 3. Effetto a catena di Android 12, con un'animazione di riempimento più morbida

Per garantire la prevedibilità degli sviluppatori e offrire un'esperienza utente ottimale, assicurati che l'effetto a catena sui tuoi dispositivi sia simile all'esempio mostrato sopra. Anche se non è necessario eseguire passaggi di integrazione specifici per supportare gli effetti a catena, dovresti testare l'effetto sui tuoi dispositivi per verificare eventuali regressioni indesiderate introdotte nella tua implementazione.

Widget

I widget sono componenti chiave di un dispositivo Android. Android 12 include nuove API e funzionalità API che tutti gli OEM dovrebbero supportare.

Risorse addizionali

Utilizzo del colore SysUI

(accento1 = LA1, accento2 = LA2, accento3 = LA3, neutro1 = N1, neutro2 = N2)

Materiale che usi per colorare

Figura 4. Utilizzo del colore dinamico nell'interfaccia utente del sistema

Aggiornamenti degli attributi colore della libreria materiali

Il materiale aggiornerà gli attributi del tema nella prossima versione creando ruoli di colore utilizzati per fornire colore a visualizzazioni specifiche.

Ruolo del colore Attributo del tema Android Tema leggero
Colore dinamico
Tema scuro
Colore dinamico
Primario colorePrimario system_accent1_600 system_accent1_200
Alla Primaria colorOnPrimary system_accento1_0 system_accent1_800
Secondario colorSecondario system_accent2_600 system_accent2_200
Sul secondario colorOnSecondary system_accento2_0 system_accent2_800
Errore colorErrore N/D (rosso_600) N/D (rosso_200)
In caso di errore colorOnError N/D (bianco) N/D (rosso_900)
Sfondo android:colorBackground system_neutral1_10 system_neutral1_900
Sullo sfondo colorSulloSfondo system_neutral1_900 system_neutral1_100
Superficie colorSurface system_neutral1_10 system_neutral1_900
In superficie colorOnSurface system_neutral1_900 system_neutral1_100

Il materiale aggiornerà i suoi attributi di stato con i seguenti puntatori:

Ruolo del colore Attributo del tema Android Tema leggero
Colore dinamico
Tema scuro
Colore dinamico
Contenuto dello stato primario colorPrimaryStateContent system_accent1_700 system_accent1_200
Livello di stato primario colorPrimaryStateLayer system_accent1_600 system_accent1_300
Contenuto dello stato secondario colorSecondaryStateContent system_accent2_700 system_accent2_200
Livello di stato secondario colorSecondaryStateLayer system_accent2_600 system_accent2_300
Sul contenuto dello stato primario colorOnPrimaryStateContent system_accento1_0 system_accent1_800
Sul livello dello stato primario colorOnPrimaryStateLayer system_accent1_900 system_accent1_800
Sul contenuto dello stato secondario colorOnSecondaryStateContent system_accento2_0 system_accent2_800
Sul livello dello stato secondario colorOnSecondaryStateLayer system_accent2_900 system_accent2_800
Sul contenuto dello stato del contenitore primario colorOnPrimaryContainerStateContent system_accent1_900 system_accent1_900
Sul livello dello stato del contenitore primario colorOnPrimaryContainerStateLayer system_accent1_900 system_accent1_900
Sul contenuto dello stato del contenitore secondario colorOnSecondaryContainerStateContent system_accent2_900 system_accent2_900
Sul livello dello stato del contenitore secondario colorOnSecondaryContainerStateLayer system_accent2_900 system_accent2_900
Sul contenuto dello stato del contenitore terziario colorOnTertiaryContainerStateContent system_accent3_900 system_accent3_900
Sul livello dello stato del contenitore terziario colorOnTertiaryContainerStateLayer system_accent3_900 system_accent3_900
Sul contenuto dello stato della superficie colorOnSurfaceStateContent system_neutral1_900 system_neutral1_100
Sul livello dello stato di superficie colorOnSurfaceStateLayer system_neutral1_900 system_neutral1_100
Contenuto dello stato della variante di superficie colorOnSurfaceVariantStateContent system_neutral2_700 system_neutral2_200
Sul livello dello stato della variante di superficie colorOnSurfaceVariantStateLayer system_neutral2_700 system_neutral2_200
Contenuto dello stato di errore colorErrorStateContent rosso800 rosso200

Domande frequenti

Estrazione del colore

Una volta che un utente cambia uno sfondo, l'estrazione del colore viene eseguita automaticamente o deve essere attivata da qualche parte?

Con le patch di Android 12 , l'estrazione del colore dello sfondo è attiva di default .

ThemeOverlayController.java attiva la logica con ThemeOverlayController#mOnColorsChangedListener e WallpaperManager#onWallpaperColorsChanged .

Per gli sfondi animati o gli sfondi video , potremmo sapere quando l'estrazione colore prende il colore dallo schermo? Alcuni utenti potrebbero desiderare i colori dell'ultimo fotogramma poiché vengono visualizzati nella maggior parte dei casi.

L'estrazione del colore viene attivata quando l'utente imposta lo sfondo o dopo un ciclo di accensione dello schermo (in risposta a WallpaperEngine#notifyColorsChanged ). L'ultimo evento WallpaperColors (dallo sfondo animato) viene applicato dopo che l'utente spegne e riaccende lo schermo.

Selettore temi/sfondi

Come posso abilitare il selettore temi per mostrare più colori sorgente affinché gli utenti possano scegliere rispetto al colore con la frequenza più alta? C'è un modo per ottenere quei colori dalla logica di estrazione?

SÌ. Nel selettore del tema puoi utilizzare ColorScheme#getSeedColors(wallpaperColors: WallpaperColors) .

C'è una funzionalità sui nomi dei pixel come icona a tema . È incluso nelle tre patch che hai condiviso? Come possono gli OEM implementarlo?

No. Le icone a tema sono in versione beta e non sono disponibili in Android 12.

Esiste un modo per utilizzare l'app Google Wallpaper con le funzionalità di estrazione e selezione del colore abilitate?

SÌ. Le funzionalità possono essere implementate nell'ultima versione dell'app Google Wallpaper seguendo i passaggi di integrazione descritti in precedenza in questa pagina.

Contatta il tuo TAM per maggiori dettagli.

Google può condividere l'app o il codice sorgente in modo che gli OEM possano implementare la propria versione dell'anteprima dinamica dei colori nel menu delle impostazioni, che è simile alla sezione di anteprima mostrata nell'app di selezione degli sfondi di Google?

Le classi principali che eseguono il rendering dell'anteprima sono WallpaperPicker2 e Launcher3 .

La schermata di anteprima dello sfondo è WallpaperSectionController .

Come implementare l' anteprima dopo aver cambiato il colore, come mostrato nell'app Google Wallpaper?

L'app di selezione dello sfondo prevede che un ContentProvider sia disponibile dal Launcher (un launcher basato su Launcher3 lo ha). L'anteprima viene fornita da GridCustomizationsProvider in Launcher, a cui è necessario fare riferimento nei metadati dell'attività principale di Launcher affinché l'app per sfondi e stili possa leggerla. Tutto questo è implementato nel Launcher3 di AOSP ed è disponibile per gli OEM.