Une encoche est une zone située sur certains appareils qui s'étend sur toute la surface de l'écran. Elle offre une expérience bord à bord tout en laissant de l’espace pour les capteurs importants à l’avant de l’appareil.
Android est compatible avec les encoches sur les appareils équipés d'Android 9 (niveau d'API 28) et plus élevée. Toutefois, les fabricants d'appareils peuvent également prendre en charge les encoches sur appareils équipés d'Android 8.1 ou version antérieure.
Ce document explique comment prendre en charge les appareils avec encoches, y compris sur l'utilisation de la zone d'encoche, c'est-à-dire la bordure rectangle sur la surface de l'écran contenant l'encoche.
Choisissez comment votre application gère les zones d'encoche
Si vous ne souhaitez pas que votre contenu chevauche une encoche,
pour que votre contenu ne chevauche pas la barre d'état et le
barre de navigation. Si vous effectuez le rendu dans la zone d'encoche, utilisez
WindowInsetsCompat.getDisplayCutout()
pour récupérer un objet DisplayCutout
qui contient les encarts sûrs et
le cadre de délimitation pour chaque encoche. Ces API permettent
vous pouvez vérifier si votre contenu
chevauche l'encoche
repositionnez-les si nécessaire.
Vous pouvez également déterminer si le contenu est disposé derrière l'encoche. La
layoutInDisplayCutoutMode
L'attribut de mise en page de la fenêtre contrôle la façon dont votre contenu est dessiné dans la zone d'encoche.
Vous pouvez définir layoutInDisplayCutoutMode
sur l'une des valeurs suivantes:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
: le contenu s'affiche dans l'encoche lorsque celle-ci est contenue la barre système. Sinon, la fenêtre ne chevauche pas l'encoche. pour Par exemple, le contenu peut être au format letterbox lorsqu'il est affiché en mode Paysage. Si votre application cible le SDK 35, ce qui est interprété commeALWAYS
pour les créations non flottantes. Windows.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
: contenu est toujours autorisé à s'étendre dans les zones d'encoche. Si votre application cible SDK 35 et qu'il s'exécute sur un appareil Android 15, c'est le seul mode autorisé pour pour garantir un affichage bord à bord.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
: le contenu s'affiche dans la zone d'encoche en mode portrait et paysage. À ne pas faire utiliser pour les fenêtres flottantes. Si votre application cible le SDK 35, cela est interprété commeALWAYS
pour les fenêtres non flottantes.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
: le contenu ne s'affiche jamais dans la zone d'encoche. Si votre application cible le SDK 35, interprétée commeALWAYS
pour les fenêtres non flottantes.
Vous pouvez définir le mode d'encoche soit par programmation, soit en définissant un
style dans votre activité. Les éléments suivants :
L'exemple définit un style pour appliquer LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
à l'activité.
<style name="ActivityTheme"> <item name="android:windowLayoutInDisplayCutoutMode"> shortEdges <!-- default, shortEdges, or never --> </item> </style>
Les sections suivantes décrivent plus en détail les différents modes de découpe.
Comportement par défaut
Si votre application cible le SDK 35 et s'exécute sur un appareil Android 15,
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
est le comportement par défaut.
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
est interprété comme
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
pour les fenêtres non flottantes.
Sinon, LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
est la valeur par défaut.
Afficher le contenu dans les encoches des bords courts
Si votre application cible le SDK 35 et s'exécute sur un appareil Android 15,
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
est interprété comme
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
pour les fenêtres non flottantes.
Avec LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
, le
le contenu s'étend dans la zone d'encoche sur le bord court de l'écran
en mode portrait et paysage, que les barres système soient masquées ou non
visible. Lorsque vous utilisez ce mode, assurez-vous qu'aucun contenu important ne chevauche
la zone de l'encoche.
L'image suivante est un exemple de LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
pour un appareil en mode portrait:
L'image suivante est un exemple de LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
pour un appareil en mode paysage:
Dans ce mode, la fenêtre s'étend sous les encoches sur le bord court de l'écran en mode portrait et paysage, que la fenêtre masque ou non la barres système.
Une encoche dans un coin est considérée comme sur le bord court:
Ne jamais afficher de contenu dans l'encoche
Si votre application cible le SDK 35 et s'exécute sur un appareil Android 15,
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
est interprété comme
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
pour les fenêtres non flottantes.
Avec LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
, la fenêtre n'est jamais autorisée à
avec la zone de l'encoche.
Voici un exemple de LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
dans
portrait:
Voici un exemple de LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
dans
Mode Paysage:
Bonnes pratiques concernant la compatibilité avec l'encoche
Lorsque vous utilisez des encoches, tenez compte des points suivants:
- Faites attention au placement des éléments essentiels de l'interface utilisateur. Ne laissez pas le pour masquer le texte, les commandes ou toute autre information important.
- Ne placez pas et n'étendez pas d'éléments interactifs qui nécessitent une dans la zone d'encoche. La sensibilité tactile peut être inférieure dans le dans la zone d'encoche.
Si possible, utilisez
<ph type="x-smartling-placeholder">WindowInsetsCompat
jusqu'à Récupérez la hauteur de la barre d'état et déterminez la marge intérieure appropriée à appliquer à votre contenu. Évitez de coder en dur la hauteur de la barre d'état, car cela peut entraîner les contenus qui se chevauchent ou sont tronqués.Utiliser
View.getLocationInWindow()
pour déterminer l'espace de fenêtre utilisé par votre application. Ne partez pas du principe que l'application en utilisant la fenêtre entière et n'utilisez pasView.getLocationOnScreen()
Utilisez les modes de découpe
<ph type="x-smartling-placeholder">always
,shortEdges
ounever
si votre application doit avant et après le mode immersif. Le comportement par défaut de l'encoche contenu de votre application pour qu'il s'affiche dans la zone d'encoche lorsque les barres système mais pas en mode immersif. Cela entraîne le déplacement du contenu vers le haut pendant les transitions, comme illustré dans l'exemple suivant.En mode immersif, vous devez choisir entre les coordonnées de fenêtre et d'écran, car votre application n'utilise pas tout l'écran au format letterbox. Grâce au letterbox, les coordonnées indiquées à partir de l'origine de l'écran ne sont pas identiques aux coordonnées depuis l'origine de la fenêtre. Vous pouvez transformer les coordonnées de l'écran en coordonnées selon vos besoins à l'aide de
<ph type="x-smartling-placeholder">getLocationOnScreen()
. L'image suivante affiche les différences de coordonnées lorsque le contenu est au format letterbox:Lors de la gestion de
MotionEvent
, utilisezMotionEvent.getX()
etMotionEvent.getY()
pour éviter des problèmes de coordonnée similaires. Ne pas utiliserMotionEvent.getRawX()
ouMotionEvent.getRawY()
Tester le rendu de votre contenu
Testez tous les écrans et expériences de votre application. Effectuez des tests sur des appareils avec des types d'encoches, si possible. Si votre appareil n'est pas doté d'une encoche, vous pouvez simuler des configurations d'encoche courantes sur n'importe quel appareil ou émulateur exécutant Android ; version 9 ou ultérieure. Pour ce faire, procédez comme suit:
- Activez les Options pour les développeurs.
- Faites défiler l'écran Developer options (Options pour les développeurs) vers le bas jusqu'à la section Drawing (Dessin). puis sélectionnez Simuler un écran avec une encoche.
Sélectionnez le type d'encoche.
<ph type="x-smartling-placeholder">
Ressources supplémentaires
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS (LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS)
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT