Gli sviluppatori spesso incontrano difficoltà uniche quando creano applicazioni per dispositivi pieghevoli, in particolare 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 seguito a modifiche alla configurazione
I problemi specifici relativi al dispositivo includono:
- Mancata corrispondenza nell'orientamento naturale del dispositivo tra la cover e i display interni (ipotesi basate su rotation_0 = verticale), che causa errori delle app durante l'apertura e la chiusura
- Gestione di diverse densità dello schermo e modifiche errate alla configurazione della densità
- Problemi di anteprima della videocamera causati dalla dipendenza del sensore della videocamera 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 delle videocamere per gestire correttamente l'orientamento e le proporzioni del dispositivo, evitare anteprime laterali e impedire immagini allungate o ritagliate
- Mantenere la continuità dell'app durante la chiusura o l'apertura del dispositivo mantenendo lo stato con
ViewModelo approcci simili oppure gestendo manualmente le modifiche della densità dello schermo e dell'orientamento, il che evita riavvii dell'app o perdita di stato - Per le app che utilizzano sensori di movimento, regola il sistema di coordinate in modo che sia allineato all'orientamento attuale dello schermo ed evita ipotesi basate su rotation_0 = portrait, garantendo interazioni precise con l'utente.
Build adattiva
Se la tua app è già adattabile e rispetta il livello ottimizzato (livello 2) descritto nelle Norme sulla qualità delle app adattabili, dovrebbe funzionare bene sui dispositivi pieghevoli. In caso contrario, prima di ricontrollare i dettagli specifici dei pieghevoli a tre ante e orizzontali, rivedi i seguenti concetti di base dello sviluppo adattivo per 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 di modalità multi-finestra o di finestre del desktop. Consulta la sezione Informazioni sui layout adattivi per ulteriori indicazioni su come:
- Progettare e implementare layout adattivi
- Regolare la navigazione principale dell'app in base alle dimensioni della finestra
- Utilizzare le classi di dimensioni delle finestre per adattare la UI dell'app
- Semplifica l'implementazione di layout canonici, ad esempio elenco-dettaglio, utilizzando le API Jetpack
Classi di dimensioni della finestra
I dispositivi pieghevoli, inclusi quelli pieghevoli orizzontali e i trifold, possono passare istantaneamente dalle classi di dimensioni delle finestre compatte, medie ed espanse. La comprensione e l'implementazione di queste classi garantiscono che la tua app mostri 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 lo spazio disponibile per l'app invocando prima la funzione
currentWindowAdaptiveInfo(), quindi utilizzando i layout corrispondenti per le tre classi di dimensioni della finestra:
val adaptiveInfo = currentWindowAdaptiveInfo()
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, vedi 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 su dispositivi pieghevoli a tre ante, pieghevoli orizzontali e altri dispositivi con schermi di grandi dimensioni. Le linee guida coprono 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 di orientamento, ridimensionamento e proporzioni sui display con larghezza più piccola >= 600 dp. Le app riempiono l'intera finestra di visualizzazione, indipendentemente dalle proporzioni o dall'orientamento preferito dall'utente, e la modalità di compatibilità 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-window, finestre delle app o display collegati) si verifica quando l'anteprima della videocamera appare allungata, laterale, ritagliata o ruotata.
Ipotesi non corrispondenti
Questo problema si verifica spesso su 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 questo presupposto. Un dispositivo pieghevole può modificare le dimensioni e le proporzioni del display senza che la rotazione del dispositivo cambi. Ad esempio, l'apertura di un dispositivo ne 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 videocamera. 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 pieghevoli orizzontali.
Soluzione 1: Jetpack CameraX (migliore)
La soluzione più semplice e solida è utilizzare la libreria Jetpack CameraX. Il suo
PreviewView elemento UI è 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 videocamera, in genere centrando e ritagliando (FILL_CENTER).
- Puoi impostare il tipo di scala su
FIT_CENTERper letterboxare l'anteprima se necessario.
Per saperne di più, 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 della videocamera utilizzando un TextureView o un SurfaceView e
applicando tutte le trasformazioni necessarie (proporzioni, scala e rotazione)
per te.
Per ulteriori informazioni, consulta il post del blog Introducing Camera Viewfinder e la guida per gli sviluppatori Anteprima della videocamera.
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 videocamera (ad esempio 0, 90, 180, 270 gradi)
da
CameraCharacteristics. - Ottieni la rotazione attuale del display del dispositivo (ad esempio, 0, 90, 180, 270 gradi).
- Utilizza questi due valori per determinare le trasformazioni necessarie per il tuo
SurfaceViewoTextureView. - Assicurati che le proporzioni dell'output
Surfacecorrispondano a quelle dell'anteprima della videocamera 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 connesso. Per questo motivo, le dimensioni dello schermo non devono essere utilizzate per determinare le dimensioni del mirino della videocamera. Utilizza invece le metriche della finestra.
Per ulteriori informazioni, consulta la guida per gli sviluppatori Anteprima della videocamera e il video La tua app Fotocamera su diversi fattori di forma.
Soluzione 4: esegui 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 è necessario eseguire l'integrazione con una libreria di videocamere. Utilizza invece un intent.
Per ulteriori informazioni, vedi Intent della videocamera.
Configurazione e continuità
I dispositivi pieghevoli migliorano la versatilità dell'interfaccia utente, ma possono avviare più modifiche alla configurazione rispetto ai dispositivi non pieghevoli. La tua app deve gestire queste modifiche alla configurazione e le loro combinazioni, come la rotazione del dispositivo, la chiusura/apertura e il ridimensionamento della finestra nelle 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 schermata 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 da dove era 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, vedi Salvare gli stati dell'interfaccia utente.
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. Android in genere riavvia l'attività
quando la densità di visualizzazione cambia, il che può causare la perdita di dati. Per impedire al sistema
di riavviare l'attività, dichiara la gestione della densità nel 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 ricaricando le bitmap o ricalcolando le dimensioni del layout) nel callback:
- Verifica che il DPI sia stato modificato in
newConfig.densityDpi - Reimposta le visualizzazioni personalizzate, le risorse disegnabili personalizzate e così via sulla nuova densità
Elementi delle risorse da elaborare
- Risorsa immagine: sostituisci bitmap e drawables con risorse specifiche per la densità o regola direttamente la scala
- Unità di layout (conversione da dp a px): ricalcola dimensioni, margine e spaziatura interna della visualizzazione
- Dimensioni carattere e testo: applica nuovamente le dimensioni del testo in unità sp
- Disegno personalizzato
View/Canvas: aggiorna i valori basati sui pixel utilizzati per disegnareCanvas
Determinazione dell'orientamento dell'app
Non fare mai affidamento sulla rotazione fisica del dispositivo durante la creazione di app adattive, perché verrà ignorata sui dispositivi con schermi grandi 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: utilizza Configuration.orientation
Questa proprietà identifica l'orientamento in cui viene attualmente visualizzata l'app.
Soluzione 2: utilizza WindowMetrics#getBounds()
Puoi ottenere i limiti di visualizzazione correnti dell'app e controllarne la larghezza e l'altezza per determinare l'orientamento.
Se devi limitare l'orientamento delle app sugli smartphone (o sugli schermi esterni dei dispositivi pieghevoli), ma non sui dispositivi con schermi grandi, consulta Orientamento delle app limitato sugli smartphone, ma non sugli schermi grandi.
Posture e modalità di visualizzazione
Le posture e gli stati dei dispositivi pieghevoli, come la modalità Tavolo e HALF_OPENED, sono supportati sia dai pieghevoli verticali che da quelli orizzontali. Tuttavia, i tre fogli
non supportano la postura a cavalletto e non possono essere utilizzati HALF_OPENED. I pieghevoli
invece offrono 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 Jetpack WindowManager come FoldingFeature.
Scopri di più su posture, stati e supporto della piegatura per l'anteprima della videocamera nelle seguenti guide per sviluppatori:
I dispositivi pieghevoli offrono esperienze di visualizzazione uniche. La modalità Display posteriore e la modalità Dual Screen consentono di creare funzionalità di visualizzazione speciali per i dispositivi pieghevoli, come l'anteprima dei selfie con la fotocamera posteriore e la visualizzazione simultanea ma diversa sui display interno ed esterno. Per saperne di più, consulta:
Blocco dell'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 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 giroscopio o accelerometro) vengono forniti nel sistema di coordinate fisso del dispositivo. Se l'utente ruota il dispositivo per giocare in orizzontale, gli assi del sensore 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 di 90°: x=-y, y=x
- Rotazione di 180°: x=-x, y=-y
- Rotazione 270: x=y, y=-x
Per i vettori di rotazione (utilizzati nelle app di bussola o XR), utilizza SensorManager.remapCoordinateSystem() per mappare la direzione dell'obiettivo della fotocamera o la parte superiore dello schermo ai nuovi assi in base alla rotazione attuale.
Compatibilità delle app
Le applicazioni devono rispettare le norme sulla qualità delle app per garantire la compatibilità con tutti i fattori di forma e i display connessi. Se un'applicazione non può rispettare le linee guida, 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 per la compatibilità fornite nella piattaforma, in particolare quelle relative all'anteprima della fotocamera, agli override e alle modifiche alle API Android 16 che potrebbero modificare il comportamento della tua app.
Per scoprire di più sulla creazione di app adattive, consulta le norme sulla qualità delle app adattive.