Уточнення: Відповідь, що надається нижче, залишається вірною, але я хочу уточнити пару речей. Оригінальне рішення розмістить подання з фактично негативним зміщенням стосовно іншого виду, як зазначено, і відобразиться у макеті, як показано.
Іншим рішенням є використання властивості translation Y, як тут запропонував Амір Хорсанді . Я вважаю за краще, щоб це рішення було простішим з одним застереженням: Переклад відбувається після макетування , тому перегляди, обмежені переглядом переміщених, не перейдуть за перекладом.
Наприклад, наступний XML відображає два TextView безпосередньо під зображенням. Кожен погляд обмежений зверху вниз з видом, який з’являється безпосередньо над ним.
<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>
Тепер, давайте переводити «Скажи моє ім'я» TextView вгору 50dp
, вказавши
android:translationY="-50dp"
Це призводить до наступного:
TextView "Скажи моє ім'я" змістився вгору, як очікувалося, але TextView "Скажи це" не дотримувався цього, як ми могли очікувати. Це відбувається тому, що переклад відбувається після макета . Незважаючи на те, що подання переміщується після макета, його все одно можна зробити натисканням у новому положенні.
Отже, IMO, перейдіть з translationX та translationY на негативні поля в ConstraintLayout, якщо попередній застереження не впливає на ваш макет; в іншому випадку перейдіть з віджетом пробілу, як зазначено нижче.
Оригінальна відповідь
Хоча не видається, що негативні маржі будуть підтримуватися в ConstraintLayout
, є спосіб досягти ефекту за допомогою доступних та підтримуваних інструментів. Ось зображення, де назва зображення перекривається 22dp
знизу зображення - фактично -22dp
полем:
Це було досягнуто за допомогою Space
віджета з нижньою межею, що дорівнює бажаному зміщенню. Потім Space
віджет обмежений донизу ImageView
. Тепер все, що вам потрібно зробити, - це обмежити верхню частину TextView
з заголовком зображення до нижньої частини Space
віджета. TextView
Буде розташований в нижній частині Space
зору , ігноруючи запас , який був встановлений.
Далі йде XML, що забезпечує цей ефект. Зауважу, що я використовую, Space
оскільки він легкий і призначений для такого типу використання, але я міг би використовувати інший тип View
і зробив його невидимим. (Мабуть, вам, можливо, доведеться вносити корективи.) Ви також можете визначити View
нульові поля та висоту потрібного поля вставки та обмежити верхню частину TextView
до верхньої частини вставки View
.
Ще одним підходом було б накладання TextView
верхньої частини ImageView
верхівки, вирівнюючи вершини / днища / ліворуч / праворуч і вносити відповідні корективи в поля / накладки. Перевага підходу, продемонстрованого нижче, полягає в тому, що негативний запас може бути створений без великих обчислень. Це все означає, що існує кілька способів наблизитись до цього.
Оновлення: для швидкого обговорення та демонстрації цієї методики перегляньте статтю блогу Google Developers Medium .
Від’ємний запас для 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>