Ritagli display supportati

Prova la modalità Scrivi
Jetpack Compose è il toolkit dell'interfaccia utente consigliato per Android. Scopri come lavorare con i ritagli del display in Compose.

Un ritaglio del display è un'area di alcuni dispositivi che si estende fino alla superficie del display. Offre un'esperienza a livello perimetrale, offrendo allo stesso tempo spazio per sensori importanti sulla parte anteriore del dispositivo.

Android supporta i ritagli del display sui dispositivi con Android 9 (livello API 28) e versioni successive. Tuttavia, i produttori di dispositivi possono anche supportare i ritagli del display sui dispositivi con Android 8.1 o versioni precedenti.

Questo documento descrive come implementare il supporto per i dispositivi con ritagli, incluso come lavorare con l'area di taglio, ovvero il rettangolo bordo a bordo sulla superficie del display che contiene il ritaglio.

Un'immagine che mostra un esempio di ritaglio del display in alto al centro
Figura 1. 1 Ritaglio del display.

Scegliere in che modo l'app gestisce le aree di ritaglio

Se non vuoi che i contenuti si sovrappongano a un'area di ritaglio, è sufficiente assicurarsi che non si sovrappongano alla barra di stato e alla barra di navigazione. Se esegui il rendering nell'area di ritaglio, usa WindowInsetsCompat.getDisplayCutout() per recuperare un oggetto DisplayCutout contenente gli insiemi sicuri e il riquadro di delimitazione per ogni ritaglio. Queste API ti consentono di verificare se i tuoi contenuti si sovrappongono al ritaglio in modo da poter riposizionare, se necessario.

Puoi anche stabilire se i contenuti sono disposti dietro l'area di ritaglio. L'attributo di layout della finestra layoutInDisplayCutoutMode controlla in che modo i contenuti vengono disegnati nell'area di ritaglio. Puoi impostare layoutInDisplayCutoutMode su uno dei seguenti valori:

Puoi impostare la modalità di ritaglio in modo programmatico o impostando uno stile nell'attività. L'esempio seguente definisce uno stile per applicare l'attributo LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES all'attività.

<style name="ActivityTheme">
  <item name="android:windowLayoutInDisplayCutoutMode">
    shortEdges <!-- default, shortEdges, or never -->
  </item>
</style>

Le seguenti sezioni descrivono in maggiore dettaglio le diverse modalità di ritaglio.

Comportamento predefinito

Per impostazione predefinita, in modalità verticale senza alcun flag speciale impostato, la barra di stato su un dispositivo con un ritaglio viene ridimensionata in modo che sia alta almeno quanto il ritaglio e i contenuti vengono visualizzati nell'area sottostante. In modalità Orizzontale o a schermo intero, la finestra dell'app è letterbox in modo che nessuno dei tuoi contenuti venga visualizzato nell'area di ritaglio.

Visualizza i contenuti in aree di ritaglio dal bordo corto

Per alcuni contenuti, come video, foto, mappe e giochi, il rendering nell'area di ritaglio può essere un ottimo modo per offrire agli utenti un'esperienza più immersiva e a livello perimetrale. Con LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, i contenuti si estendono nell'area di ritaglio sul bordo corto del display sia in verticale sia in orizzontale, indipendentemente dal fatto che le barre di sistema siano nascoste o visibili. Quando utilizzi questa modalità, assicurati che nessun contenuto importante si sovrapponga all'area di ritaglio.

La seguente immagine è un esempio di LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES per un dispositivo in verticale:

Un&#39;immagine che mostra il rendering dei contenuti nell&#39;area di ritaglio in modalità verticale
Figura 2. Rendering dei contenuti nell'area di ritaglio in modalità verticale.

La seguente immagine è un esempio di LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES per un dispositivo in orizzontale:

Un&#39;immagine che mostra il rendering dei contenuti nell&#39;area di ritaglio in modalità Orizzontale
Figura 3. Rendering dei contenuti nell'area di ritaglio in modalità Orizzontale.

In questa modalità, la finestra si estende sotto i ritagli sul bordo corto del display sia in verticale sia in orizzontale, indipendentemente dal fatto che la finestra nasconda le barre di sistema.

Un ritaglio nell'angolo è considerato sul lato corto:

Un&#39;immagine che mostra un dispositivo con un ritaglio ad angolo
Figura 4. Un dispositivo con un ritaglio d'angolo.

Non visualizzare mai i contenuti nell'area di ritaglio del display

Con LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER, la finestra non può mai sovrapporsi all'area di ritaglio.

Di seguito è riportato un esempio di LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER in verticale:

Un&#39;immagine che mostra LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER per l&#39;orientamento verticale
Figura 5. Esempio di LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER per la modalità verticale.

Di seguito è riportato un esempio di LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER in modalità Orizzontale:

Un&#39;immagine che mostra LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER per l&#39;orientamento orizzontale
Figura 6. Esempio di LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER in modalità Orizzontale.

Best practice per il supporto del ritaglio display

Quando lavori con ritagli del display, considera quanto segue:

  • Presta attenzione al posizionamento degli elementi critici dell'interfaccia utente. Non lasciare che l'area del ritaglio copra testo, controlli o altre informazioni importanti.
  • Non posizionare o estendere nell'area di ritaglio eventuali elementi interattivi che richiedono il riconoscimento tramite tocco. La sensibilità del tocco potrebbe essere più bassa nell'area del taglio.
  • Se possibile, utilizza WindowInsetsCompat per recuperare l'altezza della barra di stato e determinare la spaziatura interna appropriata da applicare ai contenuti. Evita l'hardcoded dell'altezza della barra di stato, poiché ciò potrebbe causare la sovrapposizione o l'interruzione dei contenuti.

    Un&#39;immagine che mostra contenuti tagliati nella parte superiore per una configurazione errata degli inserti
    Figura 7. Usa WindowInsetsCompat per evitare di sovrapporre o tagliare i contenuti.
  • Utilizza View.getLocationInWindow() per determinare la quantità di spazio nella finestra utilizzata dalla tua app. Non dare per scontato che l'app utilizzi l'intera finestra e non usare View.getLocationOnScreen().

  • Utilizza le modalità di ritaglio shortEdges o never se la tua app deve attivare e disattivare la modalità immersiva. Il comportamento predefinito del ritaglio può causare il rendering dei contenuti nell'app nell'area di ritaglio quando sono presenti le barre di sistema, ma non in modalità immersiva. Di conseguenza, i contenuti si spostano verso l'alto o verso il basso durante le transizioni, come mostrato nell'esempio che segue.

    Un&#39;immagine che mostra i contenuti che si muovono in alto e in basso durante le transizioni.
    Figura 8. Esempio di contenuti che si spostano in alto e in basso durante le transizioni.
  • Nella modalità immersiva, fai attenzione a utilizzare le coordinate di finestra e schermo, dato che l'app non utilizza l'intero schermo quando viene adattata al formato letterbox. A causa della letterbox, le coordinate dell'origine della schermata non corrispondono alle coordinate dell'origine della finestra. Puoi trasformare le coordinate dello schermo in coordinate della vista in base alle tue esigenze utilizzando getLocationOnScreen(). La seguente immagine mostra la differenza tra le coordinate quando i contenuti vengono adattati al formato letterbox:

    Un&#39;immagine che mostra le coordinate della finestra e dello schermo quando i contenuti sono in formato letterbox.
    Figura 9. Coordinate tra finestra e schermo quando i contenuti sono in formato letterbox.
  • Quando gestisci MotionEvent, usa MotionEvent.getX() e MotionEvent.getY() per evitare problemi di coordinate simili. Non usare MotionEvent.getRawX() o MotionEvent.getRawY().

Testare il modo in cui vengono visualizzati i contenuti

Testa tutte le schermate e le esperienze della tua app. Se possibile, fai dei test su dispositivi con diversi tipi di ritagli. Se non hai un dispositivo con un ritaglio, puoi simulare le configurazioni di ritaglio comuni su qualsiasi dispositivo o emulatore con Android 9 o versioni successive procedendo nel seguente modo:

  1. Attiva le Opzioni sviluppatore.
  2. Nella schermata Opzioni sviluppatore, scorri verso il basso fino alla sezione Disegno e seleziona Simula un display con ritaglio.
  3. Seleziona il tipo di ritaglio.

    Un&#39;immagine che mostra come simulare un ritaglio del display nell&#39;emulatore
    Figura 10. Opzioni sviluppatore per testare come vengono visualizzati i tuoi contenuti.

Risorse aggiuntive