Est-il possible d'obtenir une marge négative sur la disposition des contraintes pour obtenir un chevauchement? J'essaye d'avoir une image centrée sur la mise en page et d'avoir une vue de texte telle qu'elle chevauche un par x dp. J'ai essayé de définir une valeur de marge négative mais pas de chance. Ce serait formidable s'il y avait un moyen d'y parvenir.
118
Réponses:
Clarification: La réponse ci-dessous reste valable, mais je tiens à clarifier quelques points. La solution d'origine placera une vue avec un décalage négatif de facto par rapport à une autre vue comme indiqué et apparaîtra dans la mise en page comme indiqué.
Une autre solution consiste à utiliser la propriété translationY comme suggéré par Amir Khorsandi ici . Je préfère que cette solution soit plus simple avec une mise en garde: la traduction se produit après la mise en page , donc les vues qui sont contraintes à la vue déplacée ne suivront pas la traduction.
Par exemple, le code XML suivant affiche deux TextViews immédiatement sous l'image. Chaque vue est contrainte de haut en bas avec la vue qui apparaît immédiatement au-dessus.
Maintenant, nous allons traduire le « Say my name » TextView par
50dp
en spécifiantCela produit ce qui suit:
Le TextView "Dites mon nom" s'est déplacé vers le haut comme prévu, mais le TextView "Dites-le" ne l' a pas suivi comme on pouvait s'y attendre. En effet, la traduction a lieu après la mise en page . Bien que la vue se déplace après la mise en page, elle peut toujours être rendue cliquable dans la nouvelle position.
Donc, OMI, optez pour translationX et translationY pour les marges négatives dans ConstraintLayout si la mise en garde ci-dessus n'affecte pas votre mise en page; sinon, utilisez le widget d' espace comme indiqué ci-dessous.
Réponse originale
Bien qu'il ne semble pas que les marges négatives soient prises en charge dans
ConstraintLayout
, il existe un moyen d'obtenir l'effet en utilisant les outils disponibles et pris en charge. Voici une image où le titre de l'image se chevauche22dp
depuis le bas de l'image - en fait une-22dp
marge:Cela a été accompli en utilisant un
Space
widget avec une marge inférieure égale au décalage souhaité. LeSpace
widget a alors son bas contraint au bas du fichierImageView
. Il ne vous reste plus qu'à contraindre le haut duTextView
avec le titre de l'image au bas duSpace
widget. LeTextView
sera positionné en bas de laSpace
vue en ignorant la marge qui a été définie.Voici le XML qui accomplit cet effet. Je noterai que je l'utilise
Space
car il est léger et destiné à ce type d'utilisation, mais j'aurais pu utiliser un autre type deView
et le rendre invisible. (Vous devrez probablement faire des ajustements, cependant.) Vous pouvez également définir unView
avec des marges nulles et la hauteur de la marge de l'encart que vous voulez, et contraindreTextView
le haut de l'encart au haut de l'encartView
.Une autre approche encore consisterait à superposer
TextView
le dessusImageView
en alignant dessus / bas / gauche / droite et faire des ajustements appropriés aux marges / rembourrage. L'avantage de l'approche démontrée ci-dessous est qu'une marge négative peut être créée sans beaucoup de calcul. Tout cela pour dire qu'il existe plusieurs manières d'aborder cela.Mise à jour: pour une discussion rapide et une démonstration de cette technique, consultez l' article de blog Google Developers Medium .
Marge négative pour
ConstraintLayout
XMLla source
ImageView
est centré sur le parent,TextView
se chevauche ci-dessusImageView
. PuisSpace
fait l'erreur lorsque l'application revient de l'arrière-plan. Je pense que 0dp, 0dp pose quelques problèmes. Qu'en est-il juste utiliserGuideline
.Une autre façon est d'utiliser
translationX
outranslationY
comme ceci:ça fonctionnera comme
android:layout_marginRight="-25dp"
la source
Suivez ces deux questions:
https://code.google.com/p/android/issues/detail?id=212499 https://code.google.com/p/android/issues/detail?id=234866
la source
C'est ce que j'ai compris après des heures à essayer de trouver une solution.
Considérons deux images, image1 et image2. Image2 doit être placée au-dessus de image1 positionnée sur le côté inférieur droit.
Exemple de vues superposées
Nous pouvons utiliser le widget Espace pour les vues qui se chevauchent.
Contraignez les quatre côtés du widget Espace avec les quatre côtés de l'image1 respectivement. Pour cet exemple, contraignez le côté gauche de l'image2 avec le côté droit du widget Espace et le côté supérieur de l'image2 avec le côté inférieur du widget Espace. Cela liera image2 avec le widget Espace et comme le widget Espace est contraint de tous les côtés, nous pouvons définir le biais horizontal ou vertical requis qui déplacera l'image2 selon les besoins.
De plus, pour positionner image2 au centre-bas de image1, nous pouvons contraindre les côtés gauche et droit de l'image2 avec les côtés gauche et droit du widget Espace respectivement. De même, nous pouvons placer image2 n'importe où en modifiant les contraintes de l'image2 avec le widget Espace.
la source
J'ai trouvé un moyen beaucoup plus simple de le faire.
Fondamentalement, ayez ImageView, puis sur la vue texte, ajoutez la contrainte supérieure pour correspondre à la contrainte supérieure de l'image et ajoutez simplement la marge supérieure de TextView pour qu'elle corresponde pour obtenir le comportement de type de marge -ve.
la source
Cela aidera beaucoup
Dans mon cas, je veux ma conception comme ceci:
Cela signifie que je veux que mon image affiche la moitié de sa largeur, donc j'ai essentiellement besoin d'une marge négative de la moitié de la largeur réelle de l'image, mais toute ma mise en page dans la mise en page de contrainte et la mise en page de contrainte ne permet pas de marge négative, donc j'ai réalisé cela avec le code ci-dessous
Pour qu'ImageView se termine au début de la ligne de guidage. et l'effet est le même que la marge négative au début de 50dp.
Et aussi si la largeur de votre vue n'est pas fixe et qu'elle est en pourcentage afin que vous puissiez placer une ligne de guidage avec un pourcentage et obtenir l'effet que vous voulez
Bon codage :)
la source
Il vous suffit d'utiliser le widget Espace dans votre mise en page
la source
C'est une vieille question pourtant très posée, le moyen le plus rapide d'y parvenir est de contraindre le haut et le bas du côté de la vue sur laquelle vous souhaitez ancrer, comme ceci:
Cela le centrera sur la ligne inférieure de la vue, centrée horizontalement.
la source
Une manière simple.
Je ne suis pas sûr de la meilleure façon.
Enveloppez simplement en utilisant LinearLayout
la source