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.
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imageView"
android:layout_width="150dp"
android:layout_height="150dp"
android:tint="#388E3C"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_action_droid" />
<TextView
android:id="@+id/sayName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Say my name."
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintTop_toBottomOf="@+id/imageView"
app:layout_constraintEnd_toEndOf="@+id/imageView"
app:layout_constraintStart_toStartOf="@+id/imageView" />
<TextView
android:id="@+id/sayIt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Say it."
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintEnd_toEndOf="@+id/sayName"
app:layout_constraintStart_toStartOf="@+id/sayName"
app:layout_constraintTop_toBottomOf="@id/sayName" />
</androidx.constraintlayout.widget.ConstraintLayout>
Nun lassen Sie uns das „Say my name“ übersetzen Textview , indem 50dp
durch die Angabe
android:translationY="-50dp"
Dies 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 Bildtitel 22dp
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. Das Space
Widget hat dann seinen unteren Rand auf den unteren Rand des Widgets beschränkt ImageView
. Jetzt müssen Sie nur noch den oberen TextView
Rand des Bildtitels auf den unteren Rand des Space
Widgets beschränken. Das TextView
wird am unteren Rand der Space
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 verwenden View
und es unsichtbar machen können. (Wahrscheinlich müssen Sie jedoch Anpassungen vornehmen.) Sie können auch einen View
Rand mit Null und die Höhe des gewünschten Einschubrandes definieren und den oberen Rand TextView
auf den oberen Rand des Einschubs beschränken View
.
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
XML
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@mipmap/ic_launcher" />
<android.support.v4.widget.Space
android:id="@+id/marginSpacer"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="22dp"
app:layout_constraintBottom_toBottomOf="@+id/imageView"
app:layout_constraintLeft_toLeftOf="@id/imageView"
app:layout_constraintRight_toRightOf="@id/imageView" />
<TextView
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Say my name"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/marginSpacer" />
</android.support.constraint.ConstraintLayout>