¿Es posible lograr un margen negativo en el diseño de restricción para lograr la superposición? Estoy tratando de tener una imagen centrada en el diseño y tener una vista de texto tal que se superponga a por x dp. Intenté establecer un valor de margen negativo pero no tuve suerte. Sería genial si hubiera una manera de lograrlo.
117
Respuestas:
Aclaración: La respuesta a continuación sigue siendo válida, pero quiero aclarar un par de cosas. La solución original colocará una vista con un desplazamiento negativo de facto con respecto a otra vista como se indica y aparecerá en el diseño como se muestra.
Otra solución es usar la propiedad translationY como sugiere Amir Khorsandi aquí . Prefiero esa solución más simple con una advertencia: la traducción se produce después del diseño , por lo que las vistas que están restringidas a la vista desplazada no seguirán la traducción.
Por ejemplo, el siguiente XML muestra dos TextViews inmediatamente debajo de la imagen. Cada vista está restringida de arriba a abajo con la vista que aparece inmediatamente encima.
Ahora, vamos a traducir el "Di mi nombre" Vista de Texto por
50dp
especificandoEsto produce lo siguiente:
El TextView "Diga mi nombre" se ha movido hacia arriba como se esperaba, pero el TextView " Dígalo " no lo ha seguido como podríamos esperar. Esto se debe a que la traducción se produce después del diseño . Aunque la vista se mueve después del diseño, aún se puede hacer clic en ella en la nueva posición.
Entonces, en mi opinión, vaya con translationX y translationY para márgenes negativos en ConstraintLayout si la advertencia anterior no afecta tu diseño; de lo contrario, utilice el widget de espacio como se describe a continuación.
Respuesta original
Aunque no parece que se admitirán márgenes negativos
ConstraintLayout
, hay una manera de lograr el efecto utilizando las herramientas disponibles y compatibles. Aquí hay una imagen donde el título de la imagen se superpone22dp
desde la parte inferior de la imagen, efectivamente un-22dp
margen:Esto se logró mediante el uso de un
Space
widget con un margen inferior igual al desplazamiento que desea. ElSpace
widget tiene su parte inferior restringida a la parte inferior delImageView
. Ahora todo lo que necesita hacer es restringir la parte superiorTextView
con el título de la imagen a la parte inferior delSpace
widget. El seTextView
colocará en la parte inferior de laSpace
vista ignorando el margen que se estableció.El siguiente es el XML que logra este efecto. Notaré que lo uso
Space
porque es liviano y está pensado para este tipo de uso, pero podría haber usado otro tipoView
y hacerlo invisible. (Sin embargo, probablemente necesitará hacer ajustes). También puede definir aView
con márgenes cero y la altura del margen de inserción que desee, y restringir la parte superior deTextView
la parte superior de la inserciónView
.Otro enfoque más sería superponer la
TextView
parte superiorImageView
alineando la parte superior / inferior / izquierda / derecha y hacer los ajustes adecuados en los márgenes / relleno. El beneficio del enfoque que se muestra a continuación es que se puede crear un margen negativo sin mucho cálculo. Eso es todo para decir que hay varias formas de abordar esto.Actualización: para ver una discusión rápida y una demostración de esta técnica, consulte la publicación del blog de Google Developers Medium .
Margen negativo para
ConstraintLayout
XMLfuente
ImageView
se centra en el padre,TextView
se superpone arribaImageView
. LuegoSpace
comete el error cuando la aplicación regresa del fondo. Creo que 0dp, 0dp crea algunos problemas. ¿Qué pasa con el usoGuideline
.Otra forma es usar
translationX
otranslationY
así:funcionará como
android:layout_marginRight="-25dp"
fuente
Siga estos dos temas:
https://code.google.com/p/android/issues/detail?id=212499 https://code.google.com/p/android/issues/detail?id=234866
fuente
Esto es lo que descubrí después de horas de intentar encontrar una solución.
Consideremos dos imágenes, image1 e image2. Image2 debe colocarse en la parte superior de image1 colocada en la parte inferior derecha.
Ejemplo de vistas superpuestas
Podemos usar el widget de Espacio para vistas superpuestas.
Restrinja los cuatro lados del widget Space con los cuatro lados de la imagen1 respectivamente. Para este ejemplo, restrinja el lado izquierdo de image2 con el lado derecho del widget Space y el lado superior de image2 con el lado inferior del widget Space. Esto vinculará image2 con el widget de Espacio y dado que el widget de Espacio está restringido desde todos los lados, podemos definir el sesgo horizontal o vertical requerido que moverá la imagen2 según sea necesario.
Además, para colocar image2 en el centro inferior de image1, podemos restringir los lados izquierdo y derecho de image2 con los lados izquierdo y derecho del widget Space respectivamente. De manera similar, podemos colocar image2 en cualquier lugar cambiando las restricciones de image2 con el widget Space.
fuente
Encontré una manera de hacerlo mucho más simple.
Básicamente, tenga ImageView, luego en la Vista de texto agregue la restricción superior para que coincida con la restricción superior de la imagen y simplemente agregue el margen superior de TextView para que coincida para lograr el comportamiento del tipo de margen -ve.
fuente
Esto ayudará a muchos
En mi caso quiero mi diseño así:
Significa que quiero que mi imagen muestre la mitad de su ancho, por lo que básicamente necesito un margen negativo de la mitad del ancho real de la imagen, pero todo mi diseño en el diseño de restricción y el diseño de restricción no permite un margen negativo, así que lo logré con el siguiente código
De modo que ImageView terminará al comienzo de la guía. y el efecto es el mismo que un margen negativo al comienzo de 50dp.
Y también si el ancho de su vista no es fijo y está en porcentaje para que pueda colocar la guía con porcentaje y lograr el efecto que desee
Codificación feliz :)
fuente
Solo necesita usar el widget Space en su diseño
fuente
Esta es una pregunta antigua pero muy formulada, la forma más rápida de lograr esto es restringiendo la parte superior e inferior al lado de la vista al que desea anclar, así:
Esto lo centrará en la línea inferior de la vista, centrado horizontalmente.
fuente
Una forma sencilla.
No estoy seguro de la mejor manera.
Simplemente envuelva usando LinearLayout
fuente