Уточнення: Відповідь, що надається нижче, залишається вірною, але я хочу уточнити пару речей. Оригінальне рішення розмістить подання з фактично негативним зміщенням стосовно іншого виду, як зазначено, і відобразиться у макеті, як показано.
Іншим рішенням є використання властивості 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 .
Від’ємний запас для ConstraintLayoutXML
<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>