Làm rõ: Câu trả lời dưới đây vẫn hợp lệ, nhưng tôi muốn làm rõ một vài điều. Giải pháp ban đầu sẽ đặt một chế độ xem có độ lệch âm trên thực tế đối với một chế độ xem khác như đã nêu và sẽ xuất hiện trong bố cục như được hiển thị.
Một giải pháp khác là sử dụng translationY tài sản theo đề nghị của Amir Khorsandi đây . Tôi thích giải pháp đó đơn giản hơn với một lưu ý: Bản dịch xảy ra sau bố cục , vì vậy các chế độ xem bị giới hạn ở chế độ xem bị dịch chuyển sẽ không tuân theo bản dịch.
Ví dụ: XML sau đây hiển thị hai TextView ngay bên dưới hình ảnh. Mỗi chế độ xem được giới hạn từ trên xuống dưới với chế độ xem xuất hiện ngay phía trên nó.
<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>
Bây giờ, hãy dịch TextView "Say my name" lên bằng 50dp
cách chỉ định
android:translationY="-50dp"
Điều này tạo ra những điều sau:
TextView "Nói tên tôi" đã tăng lên như mong đợi, nhưng TextView "Hãy nói đi" đã không theo kịp như chúng ta mong đợi. Điều này là do bản dịch xảy ra sau bố cục . Mặc dù chế độ xem di chuyển sau bố cục, nó vẫn có thể nhấp được ở vị trí mới.
Vì vậy, IMO, hãy sử dụng dịchX và dịchY cho các lề âm trong ConstraintLayout nếu cảnh báo ở trên không ảnh hưởng đến bố cục của bạn; nếu không, hãy sử dụng tiện ích không gian như được nêu bên dưới.
Câu trả lời ban đầu
Mặc dù có vẻ như không hỗ trợ lợi nhuận âm ConstraintLayout
, nhưng có một cách để đạt được hiệu quả bằng cách sử dụng các công cụ có sẵn và được hỗ trợ. Đây là hình ảnh trong đó tiêu đề hình ảnh được chồng lên 22dp
từ cuối hình ảnh - thực sự là một -22dp
lề:
Điều này đã được thực hiện bằng cách sử dụng Space
tiện ích con có lợi nhuận dưới cùng bằng với mức bù mà bạn muốn. Sau Space
đó, tiện ích con có phần dưới của nó bị giới hạn ở phần dưới cùng của ImageView
. Bây giờ, tất cả những gì bạn cần làm là hạn chế phần trên cùng của TextView
tiêu đề hình ảnh ở phần cuối của Space
tiện ích. Di TextView
chúc được đặt ở cuốiSpace
cái nhìn phớt lờ bên lề đã đặt ra.
Sau đây là XML thực hiện hiệu ứng này. Tôi sẽ lưu ý rằng tôi sử dụng Space
vì nó nhẹ và dành cho loại sử dụng này, nhưng tôi có thể đã sử dụng một loại khác View
và làm cho nó vô hình. (Tuy nhiên, bạn có thể sẽ cần phải thực hiện các điều chỉnh.) Bạn cũng có thể xác định một View
lề bằng 0 và chiều cao của lề lót mà bạn muốn, đồng thời giới hạn phần trên cùng của TextView
phần trên cùng của phần chèn View
.
Tuy nhiên, một cách tiếp cận khác sẽ là phủ TextView
lên trên ImageView
bằng cách căn chỉnh các đỉnh / đáy / lề / phải và thực hiện các điều chỉnh phù hợp với lề / đệm. Lợi ích của phương pháp được trình bày dưới đây là có thể tạo ra một biên âm mà không cần tính toán nhiều. Đó là tất cả để nói rằng có một số cách để tiếp cận điều này.
Cập nhật: Để có một cuộc thảo luận nhanh và bản trình diễn về kỹ thuật này, hãy xem bài đăng trên blog của Google Developers Medium .
Ký quỹ âm cho 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>