Açıklama: Aşağıdaki cevap geçerliliğini koruyor, ancak birkaç şeyi açıklığa kavuşturmak istiyorum. Orijinal çözüm, belirtildiği gibi başka bir görünüme göre fiili bir negatif ofseti olan bir görünüm yerleştirecek ve gösterildiği gibi düzende görünecektir.
Başka bir çözüm kullanmaktır ÇeviriY Amir Khorsandi tarafından önerildiği gibi özellik burada . Tek bir uyarı ile bu çözümü daha basit tercih ediyorum: Çeviri, mizanpaj sonrası gerçekleşir , bu nedenle yer değiştiren görünümle sınırlandırılan görünümler çeviriyi takip etmeyecektir.
Örneğin, aşağıdaki XML , görüntünün hemen altında iki TextView görüntüler . Her görünüm, hemen üzerinde görünen görünümle yukarıdan aşağıya sınırlandırılmıştır.

<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>
Şimdi, "Adımı söyle" TextView öğesini50dp belirterek yukarı çevirelim
android:translationY="-50dp"
Bu, aşağıdakileri üretir:

"Adımı söyle" TextView beklendiği gibi yükseldi, ancak "Söyle" TextView beklediğimiz gibi onu takip etmedi. Bunun nedeni, çevirinin düzen sonrası gerçekleşmesidir . Görünüm yerleşim sonrası hareket etse de, yeni konumda yine de tıklanabilir hale getirilebilir.
Öyleyse, yukarıdaki uyarı mizanpajınızı etkilemiyorsa , IMO, ConstraintLayout'ta negatif kenar boşlukları için translationX ve translationY ile gidin ; aksi takdirde, aşağıda belirtildiği gibi boşluk widget'ını kullanın.
Orijinal cevap
Negatif kenar boşluklarının destekleneceği görünmese ConstraintLayoutde, mevcut ve desteklenen araçları kullanarak efekti gerçekleştirmenin bir yolu vardır. İşte görsel başlığının görüntünün 22dpaltından örtüştüğü bir görüntü - etkili bir şekilde bir -22dpkenar boşluğu:

Bu, Spaceistediğiniz uzaklığa eşit bir alt kenar boşluğuna sahip bir pencere öğesi kullanılarak gerçekleştirildi . SpaceDaha sonra, widget dibine kısıtlı dibini vardır ImageView. Şimdi yapmanız gereken tek şey, TextViewresim başlığıyla birlikte üst kısmını Spacewidget'ın alt kısmıyla sınırlamaktır . , Sayfanın TextViewaltında konumlandırılacaktır.Space ayarlandı marjı göz ardı görünümü.
Aşağıdaki, bu etkiyi gerçekleştiren XML'dir. SpaceHafif olduğu ve bu tür bir kullanım için tasarlandığından kullandığımı not edeceğim , ancak başka bir tür kullanıp Viewgörünmez yapabilirdim. (Muhtemelen olsa ayarlamalar yapmak gerekir.) Ayrıca bir tanımlayabiliriz Viewsıfır marjlarına ve istediğiniz gömme marjının yüksekliği ile ve üst sınırlamak TextViewyerleşsin üstüne View.
Bir diğer yaklaşım bindirmek için olacağını TextViewüstünde ImageViewüstleri / dipleri / kere sola / sağa ve marjlar uygun ayarlamalar yapmak / dolgu hizalayarak. Aşağıda gösterilen yaklaşımın faydası, çok fazla hesaplama yapılmadan negatif bir marjın yaratılabilmesidir. Hepsi bu, buna yaklaşmanın birkaç yolu olduğunu söylemek içindir.
Güncelleme: Bu tekniğin hızlı bir tartışması ve demosu için Google Developers Medium blog gönderisine bakın .
ConstraintLayoutXML için Negatif Marj
<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>