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 ConstraintLayout
de, 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 22dp
altından örtüştüğü bir görüntü - etkili bir şekilde bir -22dp
kenar boşluğu:
Bu, Space
istediğiniz uzaklığa eşit bir alt kenar boşluğuna sahip bir pencere öğesi kullanılarak gerçekleştirildi . Space
Daha sonra, widget dibine kısıtlı dibini vardır ImageView
. Şimdi yapmanız gereken tek şey, TextView
resim başlığıyla birlikte üst kısmını Space
widget'ın alt kısmıyla sınırlamaktır . , Sayfanın TextView
altı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. Space
Hafif 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 View
görünmez yapabilirdim. (Muhtemelen olsa ayarlamalar yapmak gerekir.) Ayrıca bir tanımlayabiliriz View
sıfır marjlarına ve istediğiniz gömme marjının yüksekliği ile ve üst sınırlamak TextView
yerleş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 .
ConstraintLayout
XML 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>