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.
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
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
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.
CameraXViewfinderfornisce unCoordinateTransformerche gestisce automaticamente i calcoli matematici, anche quando la finestra viene ridimensionata o il dispositivo viene piegato. - Comportamento corretto del layout: a differenza di
SurfaceViewoTextureView,CameraXViewfinderfunziona 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:
CameraXViewfindergestisce 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.
- 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 videocamera in modo che corrispondano alle nuove dimensioni della finestra.
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.
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.