Le app Android vengono eseguite su più fattori di forma rispetto ai soli smartphone in modalità verticale. Con l'introduzione delle finestre delle app, dei display connessi e dei dispositivi pieghevoli, l'app della fotocamera deve adattarsi a dimensioni delle finestre dinamiche, proporzioni variabili e hardware esterno.
Perché la logica dello smartphone non funziona
Le app della fotocamera spesso fanno supposizioni che causano errori critici negli ambienti con più fattori di forma.
Orientamento naturale
- Supposizione: l'orientamento naturale del dispositivo
ROTATION_0è sempre verticale - Realtà: su tablet, sul display interno di alcuni pieghevoli e sui monitor desktop,
ROTATION_0è spesso orizzontale - Risultato: l'anteprima ruota in modo errato di 90 gradi
Allineamento del sensore
- Supposizione: il bordo lungo del sensore della fotocamera è allineato al bordo lungo dello schermo
- Realtà: una finestra ridimensionabile può essere quadrata o orizzontale, mentre il sensore rimane fisso (di solito 4:3)
- Risultato: immagini allungate o altrimenti distorte
Densità e dimensioni dello schermo
- Supposizione: la densità e le dimensioni dello schermo non cambiano in fase di runtime
- Realtà: negli ambienti desktop, gli utenti ridimensionano liberamente le finestre
- Risultato: il riavvio della sessione della fotocamera a ogni evento di trascinamento interrompe l'esperienza utente e può causare arresti anomali
Soluzione 1: utilizzare gli intent di sistema
Se la tua app deve scattare una foto o registrare un video, ma non richiede un'interfaccia della fotocamera personalizzata specializzata, il modo migliore per gestire fattori di forma diversi è avviare la fotocamera di sistema preinstallata del dispositivo (vedi Intent della fotocamera).
L'utilizzo di un intent di sistema delega l'intera esperienza di acquisizione all'app della fotocamera sviluppata dal produttore di apparecchiature originali (OEM) del dispositivo. In pratica, la complessità del supporto del fattore di forma viene esternalizzata , tra cui:
- Supporto integrato per il ridimensionamento e la rotazione : l'app della fotocamera predefinita su un dispositivo pieghevole o un tablet è stata creata esplicitamente dal produttore per gestire la geometria specifica del dispositivo. L'app è progettata per funzionare correttamente quando il dispositivo viene aperto, ruotato o messo in modalità multi-finestra.
- Accesso alle funzionalità hardware avanzate : le app della fotocamera OEM hanno accesso esclusivo ad algoritmi ottimizzati per l'hardware (modalità notturna, HDR, cambio obiettivo specifico) difficili o impossibili da replicare manualmente.
Soluzione 2: utilizzare Jetpack CameraX
CameraX è una libreria Jetpack creata per semplificare lo sviluppo di app della fotocamera più semplice. CameraX è consapevole del ciclo di vita e orientata alla superficie. A differenza di Camera2, che richiede il ricalcolo manuale dell'orientamento del sensore e delle dimensioni della superficie ogni volta che un dispositivo si piega, ruota o viene ridimensionato, CameraX gestisce automaticamente la riconfigurazione delle sessioni della fotocamera durante il ridimensionamento multi-finestra o quando un'app viene spostata su un display connesso, assicurando che lo stream di anteprima si adatti senza interruzioni o allungamenti.
Componenti come PreviewView gestiscono in modo intelligente le proporzioni e i tipi di scala in diversi stati, ad esempio quando un dispositivo pieghevole passa dallo schermo esterno a quello interno, consentendoti di supportare una vasta gamma di hardware con un'unica implementazione coerente anziché una raccolta complessa di casi limite specifici del dispositivo.
Compose
Con Jetpack Compose, utilizza la libreria dedicata androidx.camera:camera-compose. La libreria fornisce il CameraXViewfinder composable, che è
progettato specificamente per gestire la geometria complessa di ridimensionamento, rotazione e
proporzioni all'interno del ciclo di vita di Compose.
Il componente CameraXViewfinder elimina le fonti di errore più comuni nelle app della fotocamera:
- Trasformazione automatica delle coordinate : una delle parti più difficili della creazione di un'app della fotocamera è la mappatura del tocco di un utente (coordinate x, y sullo schermo) al sistema di coordinate del sensore della fotocamera (0-1, 0-1 ruotato) per la messa a fuoco e la misurazione.
CameraXViewfinderfornisce unCoordinateTransformerche gestisce automaticamente i calcoli, anche quando la finestra viene ridimensionata o il dispositivo viene piegato. - Comportamento corretto del layout : a differenza di
SurfaceViewoTextureView,CameraXViewfinderfunziona correttamente con l'ordinamento z di Compose. Puoi sovrapporre elementi UI (anelli di messa a fuoco, controlli) o applicare modificatori (angoli arrotondati, animazioni) senza artefatti di rendering. - Ridimensionamento e proporzioni:
CameraXViewfindergestisce internamente la logica ritaglio al centro rispetto a adatta al centro, assicurando che l'anteprima non si allunghi quando la finestra dell'app viene ridimensionata in proporzioni non standard (ad esempio, modalità schermo diviso o finestre delle app).
Visualizzazioni
Nelle app basate su visualizzazioni, utilizza PreviewView o ViewFinderView. Se utilizzi
SurfaceView o TextureView direttamente, devi calcolare le proporzioni e
applicare la matrice di trasformazione corretta.
Soluzione 3: gestire l'orientamento e il ridimensionamento in modo dinamico
Quando utilizzi le API della piattaforma direttamente, tieni presente la rotazione del dispositivo, i riavvii dell'attività e le proporzioni.
Interrompere l'utilizzo della rotazione del dispositivo
Non fare affidamento solo su Display#getRotation() o sull'orientamento del sensore fisico
per determinare il layout dell'UI.
- Utilizzare le metriche della finestra : determina il layout (UI orizzontale o verticale) confrontando la larghezza e l'altezza della finestra dell'app utilizzando
WindowManager#getCurrentWindowMetrics(). - Ignorare l'orientamento naturale : l'app potrebbe trovarsi in una finestra di forma verticale su un monitor orizzontale. L'orientamento del dispositivo non è pertinente ai limiti dell'UI.
Evitare i riavvii dell'attività
Il comportamento predefinito di Android distrugge l'attività dell'app in caso di modifiche alla configurazione (ad esempio il ridimensionamento della finestra). Per le app della fotocamera, questo si manifesta come uno sfarfallio del display o una disconnessione durante le videochiamate.
- Configurazione del manifest : dichiara le modifiche alla configurazione nel manifest per gestire il ridimensionamento senza riavviare.
- Aggiornamenti dinamici : in
onConfigurationChanged(), aggiorna i parametri di layout dell'anteprima della fotocamera in modo che corrispondano alle nuove dimensioni della finestra.
Proporzioni e ritaglio
Un problema comune su finestre pieghevoli e desktop è l'allungamento dell'anteprima, in cui un feed videocamera 4:3 viene forzato in una finestra 16:9 o 1:1.
- Non allungare : non forzare mai il buffer della fotocamera in modo che corrisponda esattamente ai limiti della visualizzazione se le proporzioni dell'anteprima e della finestra sono diverse.
- Ritaglia al centro (consigliato): ridimensiona l'anteprima in modo che riempia la dimensione più corta della finestra e ritaglia l'eccesso. In questo modo, il soggetto rimane non distorto e riempie l'inquadratura.
- Adatta al centro (alternativa): se è fondamentale visualizzare l'intero campo visivo (ad esempio, per la scansione di un documento), inserisci l'anteprima nella finestra.
Bonus: supporto per le esperienze ottimizzate per i dispositivi pieghevoli
I dispositivi pieghevoli non sono solo smartphone che si piegano. Offrono anche stati hardware unici che possono migliorare radicalmente il modo in cui gli utenti scattano foto e registrano video. Anziché considerare la piega come un problema da risolvere, utilizzala per creare funzionalità impossibili sui dispositivi non pieghevoli.
Modalità da tavolo (acquisizione con comandi vocali)
La modalità da tavolo consente agli utenti di piegare a metà il dispositivo e di appoggiarlo su una superficie per videochiamate prolungate, fotografia time-lapse e fotografia notturna a lunga esposizione.
Modalità display posteriore (selfie di alta qualità)
- Sui dispositivi pieghevoli, le fotocamere posteriori sono in genere di qualità superiore rispetto alle fotocamere rivolte all'utente. La modalità display posteriore consente all'utente di aprire il dispositivo e ruotarlo, utilizzando il piccolo schermo esterno come mirino live per la fotocamera posteriore principale.
- La modalità display posteriore consente di scattare selfie da 50 MP o più, foto di gruppo ultra-grandangolari e video di alta qualità senza dover portare con sé attrezzature aggiuntive.
Modalità Dual Screen (anteprima del soggetto)
- La modalità Dual Screen consente di mostrare l'anteprima della fotocamera sia sullo schermo interno che su quello esterno contemporaneamente. È perfetta per fotografare le persone: i soggetti della foto possono vedersi sullo schermo esterno e regolare la posa mentre tu inquadri lo scatto sullo schermo interno.
- A differenza della modalità display posteriore (che sposta l'intera app), la modalità Dual Screen crea una finestra di presentazione secondaria sullo schermo esterno.