Gli sviluppatori spesso incontrano difficoltà uniche quando creano applicazioni per dispositivi pieghevoli, in particolare per dispositivi come Samsung Trifold o il Pixel Fold originale, che si apre in formato orizzontale (rotation_0 = landscape). Gli errori degli sviluppatori includono:
- Ipotesi errate sull'orientamento del dispositivo
- Casi d'uso trascurati
- Mancato ricalcolo o memorizzazione nella cache dei valori in caso di modifiche alla configurazione
I problemi specifici relativi al dispositivo includono:
- Una mancata corrispondenza nell'orientamento naturale del dispositivo tra i display esterno e interno (ipotesi basate su rotation_0 = portrait), che causa il malfunzionamento delle app durante le operazioni di apertura e chiusura
- Densità dello schermo diverse e gestione errata delle modifiche alla configurazione density
- Problemi di anteprima della fotocamera causati dalla dipendenza del sensore della fotocamera dall'orientamento naturale
Per offrire un'esperienza utente di alta qualità sui dispositivi pieghevoli, concentrati sulle seguenti aree critiche:
- Determina l'orientamento dell'app in base all'area dello schermo effettiva occupata dall'app, non all'orientamento fisico del dispositivo
- Aggiorna le anteprime della fotocamera per gestire correttamente l'orientamento del dispositivo e le proporzioni, evitare le anteprime laterali e impedire che le immagini vengano allungate o ritagliate
- Mantieni la continuità dell'app durante la chiusura o l'apertura del dispositivo conservando lo stato con
ViewModelo approcci simili oppure gestendo manualmente le modifiche alla densità dello schermo e all'orientamento, in modo da evitare riavvii dell'app o perdita dello stato - Per le app che utilizzano sensori di movimento, regola il sistema di coordinate in modo che sia allineato all'orientamento corrente dello schermo ed evita ipotesi basate su rotation_0 = portrait, garantendo interazioni utente precise
Creare app adattive
Se la tua app è già adattiva e rispetta il livello ottimizzato (livello 2) descritto nelle norme sulla qualità delle app adattive, dovrebbe funzionare correttamente sui dispositivi pieghevoli. In caso contrario, prima di ricontrollare i dettagli specifici dei dispositivi pieghevoli a tre ante e orizzontali, esamina i seguenti concetti di base dello sviluppo adattivo di Android.
Layout adattivi
La tua UI deve gestire non solo le diverse dimensioni dello schermo, ma anche le modifiche in tempo reale delle proporzioni, ad esempio l'apertura e l'inserimento in modalità multi-finestra o di visualizzazione a finestre del computer. Per ulteriori indicazioni su come procedere, consulta la sezione Informazioni sui layout adattivi:
- Progettare e implementare layout adattivi
- Regolare la navigazione principale dell'app in base alle dimensioni della finestra
- Utilizzare le classi di dimensioni della finestra per adattare la UI dell'app
- Semplificare l'implementazione dei layout canonici, ad esempio list‑detail, utilizzando le API Jetpack
Classi di dimensioni della finestra
I dispositivi pieghevoli, inclusi quelli orizzontali e a tre ante, possono passare istantaneamente dalle classi di dimensioni della finestra compatte, medie ed espanse. La comprensione e l'implementazione di queste classi garantiscono che l'app visualizzi i componenti di navigazione e la densità dei contenuti corretti per lo stato attuale del dispositivo.
L'esempio seguente utilizza la libreria adattiva Material 3 per determinare la quantità di
spazio disponibile per l'app richiamando prima la
currentWindowAdaptiveInfoV2() funzione e poi utilizzando i
layout corrispondenti per le classi di dimensioni della finestra:
val adaptiveInfo = currentWindowAdaptiveInfoV2()
val windowSizeClass = adaptiveInfo.windowSizeClass
when {
windowSizeClass.isWidthAtLeastBreakpoint(
WIDTH_DP_EXPANDED_LOWER_BOUND
) -> // Expanded
windowSizeClass.isWidthAtLeastBreakpoint(
WIDTH_DP_MEDIUM_LOWER_BOUND
) -> // Medium
else -> // Compact
}
Per ulteriori informazioni, consulta la sezione Utilizzare le classi di dimensioni della finestra.
Qualità delle app adattive
Il rispetto del livello 2 (app adattiva ottimizzata) o del livello 1 (app adattiva differenziata) delle norme sulla qualità delle app adattive garantisce che la tua app offra un'esperienza utente coinvolgente sui dispositivi a tre ante, sui dispositivi pieghevoli orizzontali e su altri dispositivi con schermi di grandi dimensioni. Le norme riguardano controlli critici su più livelli per passare da un'esperienza adattiva a un'esperienza differenziata.
Android 16 e versioni successive
Per le app che hanno come target Android 16 (livello API 36) e versioni successive, il sistema ignora le limitazioni relative a orientamento, ridimensionamento e proporzioni sui display con larghezza minima >= 600 dp. Le app riempiono l'intera finestra di visualizzazione, indipendentemente da proporzioni o dall'orientamento preferito dall'utente, e la modalità di compatibilità con letterbox non viene più utilizzata.
Considerazioni speciali
I dispositivi pieghevoli a tre ante e orizzontali introducono comportamenti hardware unici che richiedono una gestione specifica, in particolare per quanto riguarda sensori, anteprima della fotocamera e continuità della configurazione (mantenimento dello stato durante la chiusura, l'apertura o il ridimensionamento).
Anteprima fotocamera
Un problema comune sui dispositivi pieghevoli orizzontali o nei calcoli delle proporzioni (in scenari come multi-finestra, visualizzazione a finestre del computer o display collegati) si verifica quando l'anteprima della fotocamera appare allungata, laterale, ritagliata o ruotata.
Ipotesi non corrispondenti
Questo problema si verifica spesso sui dispositivi con schermi di grandi dimensioni e pieghevoli perché le app possono presupporre relazioni fisse tra le funzionalità della fotocamera, come le proporzioni e l'orientamento del sensore, e le funzionalità del dispositivo, come l'orientamento del dispositivo e l'orientamento naturale.
I nuovi fattori di forma mettono in discussione questa ipotesi. Un dispositivo pieghevole può modificare le dimensioni di visualizzazione e le proporzioni senza che la rotazione del dispositivo cambi. Ad esempio, l'apertura di un dispositivo modifica le proporzioni, ma se l'utente non ruota il dispositivo, la rotazione rimane la stessa. Se un'app presuppone che le proporzioni siano correlate alla rotazione del dispositivo, potrebbe ruotare o scalare in modo errato l'anteprima della fotocamera. Lo stesso può accadere se un'app presuppone che l'orientamento del sensore della fotocamera corrisponda all'orientamento verticale del dispositivo, il che non è sempre vero per i dispositivi pieghevoli orizzontali.
Soluzione 1: Jetpack CameraX (consigliata)
La soluzione più semplice e robusta è utilizzare la libreria Jetpack CameraX. Il relativo elemento UI
PreviewView è progettato per gestire automaticamente tutte le complessità dell'anteprima:
PreviewViewsi adatta correttamente all'orientamento del sensore, alla rotazione del dispositivo e alla scalabilità.- Mantiene le proporzioni dell'immagine della fotocamera, in genere centrando e ritagliando (FILL_CENTER).
- Se necessario, puoi impostare il tipo di scala su
FIT_CENTERper aggiungere letterbox all'anteprima.
Per ulteriori informazioni, consulta la sezione Implementare un'anteprima nella documentazione di CameraX.
Soluzione 2: CameraViewfinder
Se utilizzi una codebase Camera2 esistente, la libreria CameraViewfinder (compatibile con le versioni precedenti fino al livello API 21) è un'altra soluzione moderna. Semplifica la visualizzazione del feed videocamera utilizzando un TextureView o un SurfaceView e applicando tutte le trasformazioni necessarie (proporzioni, scala e rotazione).
Per ulteriori informazioni, consulta il post del blog Introducing Camera Viewfinder e la guida per gli sviluppatori Anteprima della fotocamera.
Soluzione 3: implementazione manuale di Camera2
Se non puoi utilizzare CameraX o CameraViewfinder, devi calcolare manualmente l'orientamento e le proporzioni e assicurarti che i calcoli vengano aggiornati a ogni modifica della configurazione:
- Ottieni l'orientamento del sensore della fotocamera (ad esempio, 0, 90, 180, 270 gradi) da
CameraCharacteristics. - Ottieni la rotazione corrente del display del dispositivo (ad esempio, 0, 90, 180, 270 gradi).
- Utilizza questi due valori per determinare le trasformazioni necessarie per
SurfaceViewoTextureView. - Assicurati che le proporzioni di
Surfacedi output corrispondano a quelle dell'anteprima della fotocamera per evitare distorsioni. - L'app Fotocamera potrebbe essere in esecuzione in una parte dello schermo, in modalità multi-finestra o di visualizzazione a finestre del computer oppure su un display collegato. Per questo motivo, le dimensioni dello schermo non devono essere utilizzate per determinare le dimensioni del mirino della fotocamera, ma devono essere utilizzate le metriche della finestra.
Per ulteriori informazioni, consulta la guida per gli sviluppatori Anteprima della fotocamera e il video La tua app Fotocamera su diversi fattori di forma.
Soluzione 4: eseguire azioni di base della fotocamera utilizzando un intent
Se non hai bisogno di molte funzionalità della fotocamera, una soluzione semplice è eseguire azioni di base della fotocamera, come scattare una foto o registrare un video, utilizzando l'applicazione Fotocamera predefinita del dispositivo. Non devi eseguire l'integrazione con una libreria della fotocamera, ma devi utilizzare un intent.
Per ulteriori informazioni, consulta la sezione Intent della fotocamera.
Configurazione e continuità
I dispositivi pieghevoli migliorano la versatilità della UI, ma possono avviare più modifiche alla configurazione rispetto ai dispositivi non pieghevoli. La tua app deve gestire queste modifiche alla configurazione e le relative combinazioni, ad esempio la rotazione del dispositivo, la chiusura/apertura e il ridimensionamento della finestra in modalità multi-finestra o desktop, mantenendo o ripristinando lo stato dell'app. Ad esempio, le app devono mantenere la seguente continuità:
- Stato dell'app senza arresti anomali o modifiche disruptive per gli utenti (ad esempio, quando si cambia schermo o si invia l'app in background)
- Posizione di scorrimento dei campi scorrevoli
- Testo digitato nei campi di testo e stato della tastiera
- Posizione di riproduzione dei contenuti multimediali in modo che la riproduzione riprenda dal punto in cui è stata interrotta quando è stata avviata la modifica della configurazione
Le modifiche alla configurazione attivate di frequente includono screenSize, smallestScreenSize, screenLayout, orientation, density, fontScale, touchscreen e keyboard.
Consulta android:configChanges e Gestire le modifiche alla configurazione. Per
ulteriori informazioni sulla gestione dello stato dell'app, consulta la sezione Salvare gli stati della UI.
Modifiche alla configurazione della densità
Gli schermi esterno e interno dei dispositivi pieghevoli a tre ante e orizzontali potrebbero avere densità di pixel diverse. Pertanto, la gestione della modifica della configurazione per density richiede maggiore attenzione. In genere, Android riavvia l'attività quando la densità del display cambia, il che può causare la perdita di dati. Per impedire al sistema di riavviare l'attività, dichiara la gestione della densità nel file manifest e gestisci la modifica della configurazione a livello di programmazione nella tua app.
Configurazione di AndroidManifest.xml
density: dichiara che l'app gestirà la modifica della densità dello schermo- Altre modifiche alla configurazione: è anche consigliabile dichiarare altre modifiche alla configurazione che si verificano di frequente, ad esempio
screenSize,orientation,keyboardHidden,fontScalee così via
La dichiarazione della densità (e di altre modifiche alla configurazione) impedisce al sistema di riavviare l'attività e chiama invece onConfigurationChanged().
Implementazione di onConfigurationChanged()
Quando si verifica una modifica della densità, devi aggiornare le risorse (ad esempio ricaricare le bitmap o ricalcolare le dimensioni del layout) nel callback:
- Verifica che il DPI sia stato modificato in
newConfig.densityDpi - Reimposta le visualizzazioni personalizzate, i disegnabili personalizzati e così via sulla nuova densità
Elementi di risorse da elaborare
- Risorsa immagine: sostituisci le bitmap e i disegnabili con risorse specifiche per la densità oppure regola direttamente la scala
- Unità di layout (conversione da dp a px): ricalcola le dimensioni, il margine, il padding della visualizzazione
- Dimensioni del carattere e del testo: riapplica le dimensioni del testo in unità sp
- Disegno
View/Canvaspersonalizzato: aggiorna i valori basati sui pixel utilizzati per disegnareCanvas
Determinare l'orientamento dell'app
Quando crei un'app adattiva, non fare mai affidamento sulla rotazione del dispositivo fisico, perché verrà ignorata sui dispositivi con schermi di grandi dimensioni e un'app in modalità multi-finestra potrebbe avere un orientamento diverso da quello del dispositivo. Utilizza invece Configuration.orientation o WindowMetrics per identificare se la tua app è attualmente in orientamento orizzontale o verticale in base alle dimensioni della finestra.
Soluzione 1: utilizzare Configuration.orientation
Questa proprietà identifica l'orientamento in cui viene attualmente visualizzata l'app.
Soluzione 2: utilizzare WindowMetrics#getBounds()
Puoi ottenere i limiti di visualizzazione correnti dell'app e controllare la larghezza e l'altezza per determinare l'orientamento.
Se devi limitare l'orientamento dell'app sugli smartphone (o sugli schermi esterni dei dispositivi pieghevoli), ma non sui dispositivi con schermi di grandi dimensioni, consulta la sezione L'orientamento dell'app è limitato sugli smartphone, ma non sugli schermi di grandi dimensioni.
Posizioni e modalità di visualizzazione
Le posizioni e gli stati dei dispositivi pieghevoli, come la posizione a tavolino e HALF_OPENED, sono
supportati sia dai dispositivi pieghevoli verticali sia da quelli orizzontali. I dispositivi a tre ante, tuttavia, non supportano la posizione a tavolino e non possono essere utilizzati HALF_OPENED. I dispositivi a tre ante offrono invece uno schermo più grande per un'esperienza utente unica quando sono completamente aperti.
Per differenziare la tua app sui dispositivi pieghevoli che supportano HALF_OPENED, utilizza le API adattive di Compose
Material 3, come collectFoldingFeaturesAsState() e
currentWindowAdaptiveInfoV2().
Scopri di più sulle posizioni e sugli stati dei dispositivi pieghevoli e sul supporto per l'anteprima della fotocamera nelle seguenti guide per gli sviluppatori:
I dispositivi pieghevoli offrono esperienze di visualizzazione uniche. La modalità display posteriore e la modalità a doppio schermo ti consentono di creare funzionalità di visualizzazione speciali per i dispositivi pieghevoli, come l'anteprima dei selfie con la fotocamera posteriore e display simultanei ma diversi sugli schermi interno ed esterno. Per ulteriori informazioni, consulta:
Bloccare l'orientamento sull'orientamento naturale del sensore
Per casi d'uso molto specifici, in particolare per le app che devono occupare l'intero schermo indipendentemente dallo stato di chiusura del dispositivo, il flag nosensor consente di bloccare l'app sull'orientamento naturale del dispositivo. Ad esempio, su un Pixel Fold, l'orientamento naturale del dispositivo quando è chiuso è verticale, mentre l'orientamento naturale quando è aperto è orizzontale. L'aggiunta del flag nosensor forza il blocco dell'app in verticale quando viene eseguita sul display esterno e in orizzontale quando viene eseguita sul display interno.
<activity
android:name=".MainActivity"
android:screenOrientation="nosensor">
Rimappatura dei sensori di giochi e XR
Per i giochi e le app XR, i dati dei sensori non elaborati (come il giroscopio o l'accelerometro) vengono forniti nel sistema di coordinate fisso del dispositivo. Se l'utente ruota il dispositivo per giocare in orizzontale, gli assi dei sensori non ruotano con lo schermo, il che comporta controlli di gioco errati.
Per risolvere il problema, controlla l'attuale Display.getRotation() e rimappa gli assi di conseguenza:
- Rotazione 0: x=x, y=y
- Rotazione 90: x=-y, y=x
- Rotazione 180: x=-x, y=-y
- Rotazione 270: x=y, y=-x
Per i vettori di rotazione (utilizzati nelle app bussola o XR), utilizza SensorManager.remapCoordinateSystem() per mappare la direzione dell'obiettivo della fotocamera o la parte superiore dello schermo sui nuovi assi in base alla rotazione corrente.
Compatibilità delle app
Le applicazioni devono rispettare le norme sulla qualità delle app per garantire la compatibilità su tutti i fattori di forma e i display collegati. Se un'applicazione non è in grado di rispettare le norme, i produttori di dispositivi possono implementare trattamenti di compatibilità, anche se ciò potrebbe peggiorare l'esperienza utente.
Per ulteriori informazioni, consulta l'elenco completo delle soluzioni alternative di compatibilità fornite nella piattaforma, in particolare quelle relative all'anteprima della fotocamera, alle sostituzioni e alle modifiche dell'API Android 16 che potrebbero modificare il comportamento dell'app.
Per scoprire di più sulla creazione di app adattive, consulta le norme sulla qualità delle app adattive.