Prise en charge de nouveaux facteurs de forme avec la nouvelle bibliothèque Jetpack WindowManager
Les utilisateurs peuvent placer le téléphone à plat, comme sur une table, et utiliser la moitié inférieure de l’écran pour naviguer et interagir avec l’application.
L’objectif de la bibliothèque Jetpack WindowManager est de fournir une surface API unique pour différents types d’appareils pliables qui arrivent sur le marché, afin que les développeurs d’applications puissent cibler des catégories entières d’appareils au lieu d’un seul modèle.
En version 1.0.0, la bibliothèque fournit des informations sur deux propriétés physiques des appareils pliables: les fonctionnalités d’affichage et l’état de l’appareil.
Un panneau d’affichage unique ou une configuration multi-affichage peut avoir différentes caractéristiques qui créent des perturbations dans la surface d’écran continue. Des exemples de ceux-ci peuvent être des plis, des charnières, des zones courbes ou des découpes. S’il y a de telles perturbations dans la fenêtre d’application, la disposition et le placement du contenu dans la fenêtre peuvent être adaptés pour éviter de telles zones, ou pour en profiter et les utiliser comme séparateur naturel.
Chaque zone d’entité d’affichage peut être caractérisée par son rectangle de délimitation dans l’espace de coordonnées de la fenêtre et son type. Le rectangle indiquera les limites physiques de l’entité. Le type de la fonctionnalité aidera à définir comment la traiter. Par exemple, certaines fonctionnalités peuvent créer des séparations physiques et / ou des zones non interactives (par exemple, charnière entre deux panneaux d’affichage, découpe d’affichage), tandis que d’autres peuvent servir de séparateurs logiques (par exemple, plier).
La première version de la bibliothèque de support ne comprend que deux types de fonctionnalités: TYPE_FOLD
et TYPE_HINGE
.
Pour TYPE_FOLD
en particulier, le rectangle de délimitation devrait être de zéro (0, y, largeur, y) ou de zéro (x, 0, x, hauteur). Cela indique qu’il n’y a pas de région inaccessible, mais il indique toujours la position à l’écran.
Selon la conception du matériel de charnière, différents dispositifs pliables peuvent avoir plusieurs états intermédiaires: fermés, partiellement ouverts, entièrement ouverts (surface plane) ou retournés. En utilisant la bibliothèque, les applications peuvent fournir différentes fonctions en fonction de ces états de périphérique. Ces états sont définis comme différentes postures:
Chaque appareil peut signaler n’importe quel sous-ensemble des postures définies ci-dessus en fonction de son matériel et de l’expérience utilisateur souhaitée
Pour ajouter une dépendance au gestionnaire de fenêtres, vous devez ajouter le Référentiel Google Maven à votre projet.
Ajoutez les dépendances pour les artefacts dont vous avez besoin dans le build.gradle
fichier pour votre application ou module:
Imaginons que vous souhaitiez fractionner l’interface utilisateur de votre application comme Google Duo sur les appareils pliables. En règle générale, il serait judicieux de le faire dans les cas où la configuration physique et l’état du périphérique créent une séparation logique pour l’utilisateur. Par exemple, le Galaxy Z Flip crée une telle séparation logique lorsqu’il est en mode «Flex» ou «semi-plié». Par conséquent, vous devez connaître la position du pli dans la fenêtre de l’application et l’état de l’appareil.
Tout d’abord, obtenez une instance de androidx.window.WindowManager
d’une activité.
Notez les paramètres ici.
Tout d’abord, le contexte est utilisé pour initialiser et connecter l’instance de WindowManager
à une entité visuelle sur l’écran. Donc ça doit être un visuel Context
, ce qui signifie soit Activity
ou un ContextWrapper
autour d’un.
Deuxièmement, le backend de la fenêtre est le fournisseur des informations pour la bibliothèque de support. Qui passe null
ici, cela signifierait que les informations sur le périphérique par défaut seraient utilisées et que la bibliothèque ne signalerait aucune fonctionnalité d’affichage et aucun état de périphérique inconnu lorsque l’application s’exécuterait sur un téléphone normal. Cependant, vous pouvez également transmettre une implémentation personnalisée de androidx.window.WindowBackend
pour émuler tout type d’appareil pliable sans accès au matériel physique. Nous montrons un exemple de cela dans notre exemple d’application.
Puisqu’il est logique de séparer l’interface utilisateur lorsqu’il y a une séparation logique du matériel, il y a deux cas pour le faire:
- Soit le type de la fonction d’affichage est
TYPE_HINGE
et il y a toujours une séparation physique dans la fenêtre d’activité. - Ou le type de la fonction d’affichage est
Type_Fold
, et l’état de l’écran n’est pas plat (par exemple, pasPOSTURE_OPENED
). Pour le Galaxy Z Flip en particulier, nous serons intéressés parPOSTURE_HALF_OPENED
.
Pour le cas du pli, nous devons en savoir plus sur les changements de posture de l’appareil, nous devons donc enregistrer un DeviceState
changer d’auditeur:
Dans le rappel, vous pouvez modifier l’état de l’appareil et mettre à jour l’interface utilisateur si nécessaire.
Enfin, nous devrons obtenir les fonctionnalités d’affichage réelles qui se trouvent dans la fenêtre d’activité.
Selon la façon dont votre activité gère (ou ne gère pas) les modifications de configuration, vous devrez peut-être la poser à différents moments du cycle de vie de l’activité. Si vous le demandez sur la disposition de la vue de la décoration de la fenêtre, vous serez toujours à jour après les changements d’état d’activité:
Notez que les positions des entités d’affichage sont calculées par rapport à l’espace de coordonnées de la fenêtre d’activité. Par conséquent, il ne peut être fourni qu’une fois l’activité attachée à la fenêtre. Demander les informations avant cela lèvera une exception.
Nous vous suggérons fortement d’explorer application de démonstration pour la bibliothèque. Il contient également des exemples de calcul de la position des entités d’affichage dans la hiérarchie des vues, et un exemple de une mise en page qui divise automatiquement le contenu si une fonction d’affichage de division est trouvée.