Définition de l'ordre Z des vues de RelativeLayout dans Android
Je voudrais définir l'ordre z des vues d'un RelativeLayout sous Android.
Je sais qu’une façon de procéder consiste à appeler bringToFront
.
Y a-t-il une meilleure façon de faire cela? Ce serait formidable si je pouvais définir l’ordre z dans le layout XML.
Veuillez noter que les boutons et autres éléments d'API 21 et versions supérieures ont une élévation élevée et ignorent donc l'ordre des éléments XML, quelle que soit la disposition parent. Il m'a fallu un certain temps pour comprendre cela.
J'ai rencontré les mêmes problèmes: Dans une mise en page relative parentView, j'ai 2 enfants childView1 et childView2. Au début, je mets childView1 au-dessus de childView2 et je veux que childView1 soit au-dessus de childView2. Changer l'ordre des vues des enfants ne m'a pas résolu le problème. Ce qui a fonctionné pour moi est de définir Android: clipChildren = "false" sur parentView et dans le code que j'ai défini:
childView1.bringToFront();
parentView.invalidate();
Dans Android à partir de l'API de niveau 21, les éléments du fichier de mise en forme reçoivent leur ordre Z, de la manière dont ils sont ordonnés dans le fichier, comme indiqué dans la réponse correcte, et à partir de leur altitude, une valeur d'élévation supérieure signifie que l'élément reçoit un ordre Z supérieur .
Cela peut parfois poser des problèmes, notamment avec les boutons qui apparaissent souvent au-dessus des éléments qui, selon l’ordre du XML, doivent être placés en dessous de ceux-ci, dans l’ordre Z. Pour résoudre ce problème, il suffit de définir le Android:elevation
des éléments de votre mise en page XML afin qu'il corresponde à l'ordre Z que vous souhaitez obtenir.
Si vous définissez une élévation d'un élément dans la mise en page, elle commencera à projeter une ombre. Si vous ne voulez pas cet effet, vous pouvez supprimer l'ombre avec un code comme celui-ci:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
myView.setOutlineProvider(null);
}
Je n'ai trouvé aucun moyen de supprimer l'ombre d'une vue surélevée par le biais de la mise en page XML.
Veuillez noter que vous pouvez utiliser view.setZ(float)
à partir de l’API niveau 21. Ici vous pouvez trouver plus d’informations.
Je pensais ajouter une réponse depuis l’introduction du
Android: translationZ
Le champ XML a changé un peu les choses. Les autres réponses qui suggèrent de courir
childView1.bringToFront();
parentView.invalidate();
sont totalement sur place SAUF pour que ce code n'apporte pas childView1 devant une vue avec un Android codé en dur: translationZ dans le fichier XML. J'avais des problèmes avec cela, et une fois que j'ai supprimé ce champ des autres vues, bringToFront () fonctionnait parfaitement.
L'API 21 a view.setElevation(float)
intégré
Utilisez ViewCompat.setElevation(view, float);
pour la compatibilité descendante
Plus de méthodes ViewCompat.setZ(v, pixels)
et ViewCompat.setTranslationZ(v, pixels)
Une autre façon de collecter des boutons ou de voir un tableau et d’utiliser addView
pour l’ajouter à RelativeLayout
Vous pouvez utiliser la variable personnalisée RelativeLayout
avec une définition redéfinie.
protected int getChildDrawingOrder (int childCount, int i)
Sachez que cette méthode utilise param i
comme "la vue dans laquelle dois-je dessiner i'th
" . C'est comment ViewPager
fonctionne. Il définit l’ordre de dessin personnalisé en conjonction avec PageTransformer
.
Vérifiez si vous avez une élévation sur l’une des vues en XML. Si tel est le cas, ajoutez une élévation à l'autre élément ou supprimez l'élévation pour résoudre le problème. A partir de là, c'est l'ordre des vues qui dicte ce qui vient au-dessus de l'autre.
Vous pouvez également utiliser l'exemple de code ci-dessous pour obtenir le même résultat.
ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);
Ceci est rétro-compatible. Ici mCardView
est une vue qui devrait être en dessous de sourceView
.
Ou placez le bouton ou les vues qui se chevauchent dans un FrameLayout. Ensuite, le RelativeLayout dans le fichier XML respectera l'ordre des mises en page enfants au fur et à mesure de l'ajout.