Les applications Android s'exécutent sur plus de facteurs de forme que les téléphones tenus en mode portrait. Avec l'introduction du fenêtrage du bureau, des écrans connectés et des appareils pliables, votre application d'appareil photo doit s'adapter aux tailles de fenêtre dynamiques, aux formats variables et au matériel externe.
Pourquoi la logique des téléphones ne fonctionne pas
Les applications d'appareil photo font souvent des hypothèses qui entraînent des échecs critiques dans les environnements à plusieurs facteurs de forme.
Orientation naturelle
- Hypothèse : l'orientation naturelle de l'appareil
ROTATION_0est toujours le mode portrait. - Réalité : sur les tablettes, l'écran intérieur de certains appareils pliables et les moniteurs de bureau,
ROTATION_0est souvent le mode paysage. - Résultat : l'aperçu est incorrectement pivoté de 90 degrés.
Alignement du capteur
- Hypothèse : le bord long du capteur de l'appareil photo est aligné sur le bord long de l'écran.
- Réalité : une fenêtre redimensionnable peut être carrée ou en mode paysage, tandis que le capteur reste fixe (généralement 4:3).
- Résultat : images étirées ou déformées.
Densité et taille de l'écran
- Hypothèse : la densité et la taille de l'écran ne changent pas au moment de l'exécution.
- Réalité : dans les environnements de bureau, les utilisateurs redimensionnent librement les fenêtres.
- Résultat : le redémarrage de la session de l'appareil photo à chaque événement de glissement perturbe l'expérience utilisateur et peut entraîner des plantages.
Solution 1 : Utiliser des intents système
Si votre application doit prendre une photo ou une vidéo, mais ne nécessite pas d'interface d'appareil photo personnalisée spécialisée , la meilleure façon de gérer différents facteurs de forme consiste à lancer l'appareil photo système préinstallé de l'appareil (voir Intents de l'appareil photo)
L'utilisation d'un intent système délègue l'ensemble de l'expérience de capture à l'application d'appareil photo développée par le fabricant d'équipement d'origine (OEM) de l'appareil. Cela externalise efficacement la complexité de la prise en charge des facteurs de forme, y compris :
- Prise en charge intégrée du redimensionnement et de la rotation : l'application d'appareil photo par défaut sur un appareil pliable ou une tablette est explicitement conçue par le fabricant pour gérer la géométrie spécifique de cet appareil. L'application est conçue pour se comporter correctement lorsque l'appareil est déplié, pivoté ou mis en mode multifenêtre.
- Accès aux fonctionnalités matérielles avancées : les applications d'appareil photo OEM ont un accès exclusif aux algorithmes optimisés pour le matériel (mode nuit, HDR, commutation d'objectif spécifique) qui sont difficiles, voire impossibles à reproduire manuellement.
Solution 2 : Utiliser Jetpack CameraX
CameraX est une bibliothèque Jetpack conçue pour faciliter le développement d'applications d'appareil photo plus facile. CameraX tient compte du cycle de vie et est orienté surface. Contrairement à Camera2, qui nécessite un recalcul manuel de l'orientation du capteur et des tailles de surface chaque fois qu'un appareil se plie, pivote ou est redimensionné, CameraX gère automatiquement la reconfiguration des sessions d'appareil photo lors du redimensionnement multifenêtre ou lorsqu'une application passe à un écran connecté, ce qui garantit que le flux d'aperçu s'adapte sans saccades ni étirements.
Les composants tels que PreviewView gèrent intelligemment le format et les
types d'échelle dans différents états, par exemple lorsqu'un appareil pliable passe de l'écran de couverture à l'écran intérieur. Vous pouvez ainsi prendre en charge une large gamme de matériel avec
une seule implémentation cohérente plutôt qu'une collection complexe de
cas extrêmes spécifiques à l'appareil.
Compose
Avec Jetpack Compose, utilisez la bibliothèque androidx.camera:camera-compose
dédiée. La bibliothèque fournit le CameraXViewfinder composable, qui est
spécifiquement conçu pour gérer la géométrie complexe du redimensionnement, de la rotation et
des formats dans le cycle de vie de Compose.
Le composant CameraXViewfinder élimine les sources d'erreurs les plus courantes dans les applications d'appareil photo :
- Transformation automatique des coordonnées : l'une des parties les plus difficiles de la création d'une application d'appareil photo consiste à mapper l'appui d'un utilisateur (coordonnées x, y à l'écran) sur le système de coordonnées du capteur de l'appareil photo (0-1, 0-1 pivoté) pour la mise au point et la mesure.
CameraXViewfinderfournit unCoordinateTransformerqui gère automatiquement les calculs mathématiques, même lorsque la fenêtre est redimensionnée ou que l' appareil est plié. - Comportement correct de la mise en page : contrairement à
SurfaceViewouTextureView,CameraXViewfinderfonctionne correctement avec l'ordre z de Compose. Vous pouvez superposer des éléments d'interface utilisateur (cercles de mise au point, commandes) ou appliquer des modificateurs (coins arrondis, animations) sans afficher d'artefacts. - Redimensionnement et format :
CameraXViewfindergère en interne la logique recadrer au centre par rapport à ajuster au centre, ce qui garantit que l'aperçu ne s'étire pas lorsque la fenêtre de l'application est redimensionnée dans des formats non standards (par exemple, le mode écran partagé ou le mode fenêtrage du bureau).
Vues
Sur les applications basées sur les vues, utilisez PreviewView ou ViewFinderView. Si vous utilisez
SurfaceView ou TextureView directement, vous devez calculer vous-même le format et
appliquer la matrice de transformation appropriée.
Solution 3 : Gérer l'orientation et le redimensionnement de manière dynamique
Lorsque vous utilisez directement les API de la plate-forme, tenez compte de la rotation de l'appareil, des redémarrages d'activité et du format.
Arrêter d'utiliser la rotation de l'appareil
Ne vous fiez pas uniquement à Display#getRotation() ou à l'orientation du capteur physique seul
pour déterminer la mise en page de votre interface utilisateur.
- Utiliser les métriques de la fenêtre : déterminez votre mise en page (interface utilisateur en mode paysage ou portrait
) en comparant la largeur et la hauteur de la fenêtre de votre application à l'aide
WindowManager#getCurrentWindowMetrics(). - Ignorer l'orientation naturelle : votre application peut se trouver dans une fenêtre en forme de portrait sur un moniteur en mode paysage. L'orientation de l'appareil n'a aucune incidence sur les limites de votre interface utilisateur.
Éviter les redémarrages d'activité
Le comportement Android par défaut détruit l'activité de votre application lors des modifications de configuration (comme le redimensionnement de la fenêtre). Pour les applications d'appareil photo, cela se traduit par un scintillement de l'écran ou une perte de connexion lors des appels vidéo.
- Configuration du fichier manifeste : déclarez les modifications de configuration dans votre fichier manifeste pour gérer le redimensionnement sans redémarrer.
- Mises à jour dynamiques : dans
onConfigurationChanged(), mettez à jour les paramètres de mise en page de l'aperçu de votre appareil photo pour qu'ils correspondent à la nouvelle taille de la fenêtre.
Format et recadrage
Un problème courant sur les appareils pliables et les fenêtres de bureau est l'étirement de l'aperçu, où un flux d'appareil photo 4:3 est forcé dans une fenêtre 16:9 ou 1:1.
- Ne pas étirer : ne forcez jamais le tampon de l'appareil photo à correspondre exactement aux limites de la vue si les formats de l'aperçu et de la fenêtre sont différents.
- Recadrer au centre (recommandé) : mettez à l'échelle l'aperçu pour remplir la dimension la plus courte de la fenêtre et recadrez l'excédent. Cela garantit que le sujet reste non déformé et remplit le cadre.
- Ajuster au centre (alternative) : si l'affichage du champ de vision complet est essentiel (par exemple, pour numériser un document), affichez l'aperçu au format letterbox dans la fenêtre.
Bonus : Prise en charge des expériences axées sur les appareils pliables
Les appareils pliables ne sont pas que des téléphones qui se plient. Ils offrent également des états matériels uniques qui peuvent améliorer fondamentalement la façon dont les utilisateurs prennent des photos et des vidéos. Au lieu de considérer le pli comme un problème à résoudre, utilisez-le pour créer des fonctionnalités impossibles sur les appareils non pliables.
Mode sur table (capture mains libres)
Le mode sur table permet aux utilisateurs de plier l'appareil à moitié et de le poser sur une surface pour les appels vidéo prolongés, la photographie en accéléré et la photographie de nuit à longue exposition.
Mode d'affichage arrière (selfies de haute qualité)
- Sur les appareils pliables, les caméras arrière sont généralement de meilleure qualité que les caméras orientées vers l'utilisateur. Le mode d'affichage arrière permet à l'utilisateur de déplier l'appareil et de le retourner, en utilisant le petit écran de couverture comme viseur en direct pour la caméra arrière principale.
- Le mode d'affichage arrière permet de prendre des selfies de 50 Mpx ou plus, des photos de groupe ultra grand-angle et des vlogs de haute qualité sans avoir à transporter d'équipement supplémentaire.
Mode Dual Screen (aperçu du sujet)
- Le mode Dual Screen vous permet d'afficher l'aperçu de l'appareil photo sur les écrans intérieur et extérieur simultanément. Il est idéal pour photographier des personnes : les sujets peuvent se voir sur l'écran extérieur et ajuster leur pose pendant que vous cadrez la photo sur l'écran intérieur.
- Contrairement au mode d'affichage arrière (qui déplace l'ensemble de l'application), le mode Dual Screen crée une fenêtre de présentation secondaire sur l'écran de couverture.