Supportare la fotocamera su più fattori di forma

Le app per Android vengono eseguite su più fattori di forma rispetto ai soli smartphone tenuti in modalità verticale. Con l'introduzione delle finestre delle app, dei display connessi e dei dispositivi pieghevoli, l'app Fotocamera deve adattarsi alle dimensioni dinamiche delle finestre, ai diversi formati e all'hardware esterno.

Figura 1. Esempio di app per videocamere su display diversi.

Perché la logica del telefono non funziona

Le app per la fotocamera spesso fanno ipotesi che causano errori critici in ambienti con più fattori di forma.

Orientamento naturale

  • Presupposto: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
Figura 2. Mirino della fotocamera prima e dopo l'applicazione della rotazione corretta.

Allineamento del sensore

  • Presupposto:il lato lungo del sensore della videocamera è allineato al lato 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 distorte in altro modo
Figura 3. Mirino della videocamera prima e dopo l'applicazione del fattore di scala corretto.

Densità e dimensioni dello schermo

  • Presupposto: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 videocamera a ogni evento di trascinamento interrompe l'esperienza utente e può causare arresti anomali

Soluzione 1: utilizza gli intent di sistema

Se la tua app deve scattare una foto o registrare un video, ma non richiede un'interfaccia personalizzata specializzata per la fotocamera, il modo migliore per gestire i diversi fattori di forma è 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 fotocamera sviluppata dal produttore di apparecchiature originali (OEM) del dispositivo. In questo modo, viene esternalizzata la complessità del supporto del fattore di forma, tra cui:

  • Supporto integrato per il ridimensionamento e la rotazione: l'app Fotocamera predefinita su un dispositivo pieghevole o tablet è creata esplicitamente dal produttore per gestire la geometria specifica del dispositivo. L'app è progettata per funzionare correttamente quando il dispositivo è aperto, ruotato o in modalità multi-finestra.

  • Accesso a funzionalità hardware avanzate: le app per la fotocamera OEM hanno accesso esclusivo ad algoritmi ottimizzati per l'hardware (modalità notturna, HDR, cambio obiettivo specifico) che sono difficili o impossibili da replicare manualmente.

Soluzione 2: utilizza Jetpack CameraX

CameraX è una libreria Jetpack creata per semplificare lo sviluppo di app fotocamera. CameraX è consapevole del ciclo di vita e orientato 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 videocamera durante il ridimensionamento in modalità multi-finestra o quando un'app viene spostata su un display connesso, garantendo che il flusso di anteprima si adatti senza stuttering o allungamenti.

Componenti come PreviewView gestiscono in modo intelligente le proporzioni e i tipi di scalabilità in diversi stati, ad esempio un dispositivo pieghevole che passa dallo schermo della cover allo schermo interno, consentendoti di supportare una vasta gamma di hardware con un'unica implementazione coerente anziché una complessa raccolta di casi limite specifici per il dispositivo.

Scrivi

Con Jetpack Compose, utilizza la libreria dedicata androidx.camera:camera-compose. La libreria fornisce il componente componibile CameraXViewfinder, che è progettato specificamente per gestire la complessa geometria 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 fotocamera:

  • Trasformazione automatica delle coordinate: una delle parti più difficili della creazione di un'app 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. CameraXViewfinder fornisce un CoordinateTransformer che gestisce automaticamente i calcoli matematici, anche quando la finestra viene ridimensionata o il dispositivo viene piegato.
  • Comportamento corretto del layout: a differenza di SurfaceView o TextureView, CameraXViewfinder funziona correttamente con l'ordine Z di Compose. Puoi sovrapporre elementi della UI (anelli di messa a fuoco, controlli) o applicare modificatori (angoli arrotondati, animazioni) senza artefatti di rendering.
  • Ridimensionamento e proporzioni: CameraXViewfinder gestisce internamente la logica di ritaglio centrale e adattamento 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 finestra del desktop).

Visualizzazioni

Nelle app basate sulla visualizzazione, 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 direttamente le API della piattaforma, 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 fisico del sensore per determinare il layout dell'interfaccia utente.

  • Utilizza le metriche della finestra: determina il layout (interfaccia utente orizzontale o verticale) confrontando la larghezza e l'altezza della finestra dell'app utilizzando WindowManager#getCurrentWindowMetrics().
  • Ignora orientamento naturale: la tua app potrebbe trovarsi in una finestra verticale su un monitor orizzontale. L'orientamento del dispositivo è irrilevante per i limiti della UI.

Evitare i riavvii dell'attività

Il comportamento predefinito di Android distrugge l'attività dell'app in caso di modifiche alla configurazione (come il ridimensionamento della finestra). Per le app per videocamere, questo problema si manifesta come sfarfallio del display o interruzione della connessione durante le videochiamate.

Proporzioni e ritaglio

Un problema comune sui dispositivi pieghevoli e sulle finestre del computer è lo stiramento dell'anteprima, in cui un feed della videocamera 4:3 viene forzato in una finestra 16:9 o 1:1.

  • Non estendere: non forzare mai la corrispondenza esatta del buffer della videocamera con i limiti della visualizzazione se le proporzioni dell'anteprima e della finestra sono diverse.
  • Ritaglio centrale (consigliato): ridimensiona l'anteprima in modo che riempia la dimensione più corta della finestra e ritaglia la parte in eccesso. In questo modo, il soggetto rimane non distorto e riempie l'inquadratura.
  • Centra (alternativa): se è fondamentale visualizzare l'intero campo visivo (ad esempio, la scansione di un documento), inserisci la preview in formato letterbox all'interno della finestra.
  • Centra (alternativa): se è fondamentale visualizzare l'intero campo visivo (ad esempio, la scansione di un documento), inserisci la preview in formato letterbox all'interno della finestra.

Bonus: supporto per esperienze ottimizzate per i dispositivi pieghevoli

I dispositivi pieghevoli non sono solo smartphone che si piegano, ma offrono 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 appoggiarlo su una superficie per videochiamate prolungate, fotografia time-lapse e fotografia notturna a lunga esposizione.

Figura 5. Un'app di comunicazione in modalità da tavolo: il mirino della videocamera si trova nella parte superiore della cerniera e i controlli in basso.

Modalità display posteriore (selfie di alta qualità)

  • Sugli smartphone pieghevoli, le fotocamere posteriori sono in genere di qualità superiore rispetto a quelle rivolte verso l'utente. La modalità Display posteriore consente all'utente di aprire il dispositivo e girarlo, utilizzando il piccolo schermo della cover come mirino live per la fotocamera posteriore principale.
  • La modalità di visualizzazione posteriore consente di scattare selfie da 50 MP e foto di gruppo ultra grandangolari, oltre a vlog di alta qualità senza bisogno di attrezzature aggiuntive.

Modalità Dual Screen (anteprima del soggetto)

  • La modalità Dual Screen ti consente di mostrare l'anteprima della videocamera sia sullo schermo interno che su quello esterno contemporaneamente. Questa funzionalità è 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à doppio schermo crea una finestra di presentazione secondaria sullo schermo della cover.
Figura 5. Un'app fotocamera in modalità Dual Screen.