Ist es möglich, einen negativen Spielraum beim Einschränkungslayout zu erzielen, um eine Überlappung zu erzielen? Ich versuche, ein Bild auf dem Layout zu zentrieren und eine Textansicht zu haben, die a um x dp überlappt. Ich habe versucht, einen negativen Margin-Wert einzustellen, aber kein Glück. Es wäre großartig, wenn es einen Weg gäbe, dies zu erreichen.
116
Antworten:
Klarstellung: Die folgende Antwort bleibt gültig, aber ich möchte ein paar Dinge klarstellen. Die ursprüngliche Lösung platziert eine Ansicht mit einem de facto negativen Versatz in Bezug auf eine andere Ansicht wie angegeben und wird wie gezeigt im Layout angezeigt.
Eine andere Lösung besteht darin, die von Amir Khorsandi hier vorgeschlagene translationY- Eigenschaft zu verwenden . Ich bevorzuge diese Lösung als einfacher mit einer Einschränkung: Die Übersetzung erfolgt nach dem Layout , sodass Ansichten, die auf die verschobene Ansicht beschränkt sind, nicht der Übersetzung folgen.
In der folgenden XML- Datei werden beispielsweise zwei Textansichten direkt unter dem Bild angezeigt . Jede Ansicht ist von oben nach unten eingeschränkt, wobei die Ansicht unmittelbar darüber angezeigt wird.
Nun lassen Sie uns das „Say my name“ übersetzen Textview , indem
50dp
durch die AngabeDies ergibt Folgendes:
Die Textansicht "Sag meinen Namen" hat sich wie erwartet verschoben, aber die Textansicht "Sag es" hat sie nicht wie erwartet weiterverfolgt . Dies liegt daran, dass die Übersetzung nach dem Layout erfolgt . Obwohl die Ansicht nach dem Layout verschoben wird, kann sie an der neuen Position weiterhin anklickbar gemacht werden.
Also, IMO, wählen Sie in ConstraintLayout für negative Ränder translationX und translationY, wenn die oben genannten Einschränkungen Ihr Layout nicht beeinflussen. Andernfalls verwenden Sie das unten beschriebene Leerzeichen- Widget.
Ursprüngliche Antwort
Obwohl es nicht den Anschein hat, dass negative Ränder unterstützt werden
ConstraintLayout
, gibt es eine Möglichkeit, den Effekt mithilfe der verfügbaren und unterstützten Tools zu erzielen. Hier ist ein Bild, bei dem sich der Bildtitel22dp
vom unteren Bildrand überlappt - praktisch ein-22dp
Rand:Dies wurde erreicht, indem ein
Space
Widget mit einem unteren Rand verwendet wurde, der dem gewünschten Versatz entspricht. DasSpace
Widget hat dann seinen unteren Rand auf den unteren Rand des Widgets beschränktImageView
. Jetzt müssen Sie nur noch den oberenTextView
Rand des Bildtitels auf den unteren Rand desSpace
Widgets beschränken. DasTextView
wird am unteren Rand derSpace
Ansicht positioniert, wobei der festgelegte Rand ignoriert wird.Das Folgende ist das XML, das diesen Effekt erzielt. Ich werde bemerken, dass ich benutze,
Space
weil es leicht ist und für diese Art der Verwendung vorgesehen ist, aber ich hätte eine andere Art von verwendenView
und es unsichtbar machen können. (Wahrscheinlich müssen Sie jedoch Anpassungen vornehmen.) Sie können auch einenView
Rand mit Null und die Höhe des gewünschten Einschubrandes definieren und den oberen RandTextView
auf den oberen Rand des Einschubs beschränkenView
.Ein weiterer Ansatz wäre, die
TextView
Oberseite zu überlagern,ImageView
indem oben / unten / links / rechts ausgerichtet und geeignete Anpassungen an Rändern / Polstern vorgenommen werden. Der Vorteil des unten gezeigten Ansatzes besteht darin, dass eine negative Marge ohne viel Rechenaufwand erstellt werden kann. Das heißt, es gibt verschiedene Möglichkeiten, dies zu erreichen.Update: Eine kurze Diskussion und Demo dieser Technik finden Sie im Blogbeitrag von Google Developers Medium .
Negative Margin für
ConstraintLayout
XMLquelle
ImageView
ist auf den Elternteil zentriert,TextView
überlappt sich obenImageView
. DannSpace
macht der Fehler, wenn App aus dem Hintergrund zurück. Ich denke 0dp, 0dp macht einige Probleme. Was ist mit nur verwendenGuideline
.Ein anderer Weg ist
translationX
odertranslationY
so:es wird so funktionieren
android:layout_marginRight="-25dp"
quelle
Befolgen Sie diese beiden Punkte:
https://code.google.com/p/android/issues/detail?id=212499 https://code.google.com/p/android/issues/detail?id=234866
quelle
Dies habe ich herausgefunden, nachdem ich stundenlang versucht hatte, eine Lösung zu finden.
Betrachten wir zwei Bilder, Bild1 und Bild2. Bild2 ist oben rechts auf Bild1 zu platzieren.
Beispiel für überlappende Ansichten
Wir können das Space- Widget für überlappende Ansichten verwenden.
Beschränken Sie die vier Seiten des Space-Widgets auf die vier Seiten des Bildes1. In diesem Beispiel beschränken Sie die linke Seite von image2 auf die rechte Seite des Space-Widgets und die Oberseite von image2 auf die untere Seite des Space-Widgets. Dadurch wird image2 mit dem Space-Widget verknüpft. Da das Space-Widget von allen Seiten eingeschränkt ist, können Sie die erforderliche horizontale oder vertikale Vorspannung definieren, die image2 nach Bedarf verschiebt.
Um Bild2 in der Mitte unten in Bild1 zu positionieren, können Sie außerdem die linke und rechte Seite von Bild2 mit der linken bzw. rechten Seite des Space-Widgets einschränken. Ebenso können wir image2 an einer beliebigen Stelle platzieren, indem wir die Einschränkungen von image2 mit dem Space-Widget ändern.
quelle
Ich habe einen Weg gefunden, es viel einfacher zu machen.
Lassen Sie die ImageView im Grunde genommen die oberste Einschränkung in der Textansicht hinzufügen, um sie an die oberste Einschränkung des Bildes anzupassen, und fügen Sie einfach den oberen Rand der Textansicht hinzu, um das Verhalten des Randtyps -ve zu erreichen.
quelle
Dies wird vielen helfen
In meinem Fall möchte ich mein Design so:
Das heißt, ich möchte, dass mein Bild die Hälfte ihrer Breite anzeigt, daher benötige ich im Grunde genommen einen negativen Rand der Hälfte der tatsächlichen Bildbreite, aber mein gesamtes Layout im Einschränkungslayout und im Einschränkungslayout erlaubt keinen negativen Rand, also habe ich dies mit dem folgenden Code erreicht
Damit ImageView am Anfang der Richtlinie endet. und der Effekt ist der gleiche wie bei einer negativen Marge zu Beginn von 50 dp.
Und auch, wenn die Breite Ihrer Ansicht nicht festgelegt und in Prozent angegeben ist, sodass Sie die Richtlinie mit dem Prozentsatz platzieren und den gewünschten Effekt erzielen können
Viel Spaß beim Codieren :)
quelle
Sie müssen nur das Space-Widget in Ihrem Layout verwenden
quelle
Dies ist eine alte Frage, die jedoch sehr häufig gestellt wird. Der schnellste Weg, dies zu erreichen, besteht darin, die Ober- und Unterseite auf die Seite der Ansicht zu beschränken, an der Sie verankern möchten.
Dadurch wird es in der unteren Zeile der Ansicht horizontal zentriert zentriert.
quelle
Ein einfacher Weg.
Ich bin mir nicht sicher, wie ich es am besten machen soll.
Einfach mit LinearLayout einwickeln
quelle