Esclarecimento: a resposta abaixo continua válida, mas quero esclarecer algumas coisas. A solução original colocará uma vista com um deslocamento negativo de fato em relação a outra vista conforme declarado e aparecerá no layout conforme mostrado.
Outra solução é usar a propriedade translationY conforme sugerido por Amir Khorsandi aqui . Eu prefiro essa solução mais simples com uma ressalva: a tradução ocorre após o layout , de modo que as vistas que são restritas à vista deslocada não sigam a tradução.
Por exemplo, o seguinte XML exibe dois TextViews imediatamente abaixo da imagem. Cada visualização é restrita de cima para baixo com a visualização que aparece imediatamente acima dela.
<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>
Agora, vamos traduzir o "Diga meu nome" TextView por 50dp
especificando
android:translationY="-50dp"
Isso produz o seguinte:
O TextView "Diga meu nome" mudou conforme o esperado, mas o TextView "Diga" não o acompanhou como esperávamos. Isso ocorre porque a tradução ocorre após o layout . Embora a visualização se mova após o layout, ela ainda pode ser clicada na nova posição.
Então, IMO, vá com translationX e translationY para margens negativas em ConstraintLayout se a advertência acima não afetar seu layout; caso contrário, vá com o widget de espaço conforme descrito abaixo.
Resposta original
Embora não pareça que as margens negativas serão suportadas ConstraintLayout
, existe uma maneira de conseguir o efeito usando as ferramentas disponíveis e suportadas. Aqui está uma imagem onde o título da imagem é sobreposto 22dp
na parte inferior da imagem - efetivamente uma -22dp
margem:
Isso foi feito usando um Space
widget com uma margem inferior igual ao deslocamento que você deseja. O Space
widget, então, tem sua parte inferior restrita à parte inferior do ImageView
. Agora tudo que você precisa fazer é restringir a parte superior do TextView
com o título da imagem na parte inferior do Space
widget. O TextView
será posicionado na parte inferior da Space
visualização, ignorando a margem que foi configurada.
A seguir está o XML que realiza esse efeito. Vou notar que uso Space
porque é leve e destinado a esse tipo de uso, mas poderia ter usado outro tipo de View
e torná-lo invisível. (Você provavelmente precisará fazer ajustes, no entanto.) Você também pode definir a View
com margens zero e a altura da margem de inserção desejada e restringir a parte superior da TextView
ao topo da inserção View
.
Outra abordagem seria sobrepor a TextView
parte ImageView
superior alinhando parte superior / inferior / esquerda / direita e fazer ajustes adequados nas margens / preenchimento. O benefício da abordagem demonstrada a seguir é que uma margem negativa pode ser criada sem muitos cálculos. Isso quer dizer que existem várias maneiras de abordar isso.
Atualização: para uma rápida discussão e demonstração dessa técnica, consulte a postagem do blog Google Developers Medium .
Margem negativa para 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>