Tengo una vista de imagen. Quiero que su ancho sea fill_parent. Quiero que su altura sea cualquiera que sea el ancho. Por ejemplo:
<ImageView
android:layout_width="fill_parent"
android:layout_height="whatever the width ends up being" />
¿Es posible algo así en un archivo de diseño sin tener que crear mi propia clase de vista?
Gracias
Respuestas:
Actualización: 14 de septiembre de 2017
Según un comentario a continuación, el porcentaje de biblioteca de soporte está en desuso a partir de Android Support Library 26.0.0. Esta es la nueva forma de hacerlo:
Ver aquí
Obsoleto:
De acuerdo con esta publicación de Desarrolladores de Android, todo lo que necesita hacer ahora es ajustar lo que quiera dentro de un PercentRelativeLayout o un PercentFrameLayout, y luego especificar sus proporciones, de esta manera
fuente
Tal vez esto responderá tu pregunta:
Puede ignorar el
scaleType
atributo para esta situación particular.fuente
Esto se puede hacer usando LayoutParams para establecer dinámicamente la altura de las Vistas una vez que conozca el ancho de las Vistas en tiempo de ejecución. Debe usar un subproceso ejecutable para obtener el ancho de Vistas en tiempo de ejecución o de lo contrario intentará establecer la Altura antes de conocer el ancho de la Vista porque el diseño aún no se ha dibujado.
Ejemplo de cómo resolví mi problema:
Los LayoutParams deben ser del tipo de la Vista principal en la que se encuentra su vista. Mi FrameLayout está dentro de un RelativeLayout en el archivo xml.
se llama para forzar que la vista se vuelva a dibujar mientras está en un hilo separado del hilo de la interfaz de usuario
fuente
onMeasure
, como se muestra en la respuesta de Regis . Una alternativa, pero solo para vistas representadas a través de un adaptador, por ejemploGridView
, dentro , es la respuesta de Matt .requestLayout()
después de configurar los parámetros. ¿Por qué sería eso?No pude obtener la respuesta de David Chu para trabajar para un elemento RecyclerView y descubrí que necesitaba restringir el ImageView al padre. Establezca el ancho de ImageView en
0dp
y restrinja su inicio y fin al padre. No estoy seguro de si establecer el anchowrap_content
omatch_parent
funciona en algunos casos, pero creo que esta es una mejor manera de hacer que el hijo de un RestraintLayout llene a su padre.fuente
Aquí lo que hice para tener un ImageButton que siempre tiene un ancho igual a su altura (y evitar márgenes vacíos estúpidos en una dirección ... lo que considero un error del SDK ...):
Definí una clase SquareImageButton que se extiende desde ImageButton:
Aquí está mi xml:
Funciona de maravilla !
fuente
En Android 26.0.0, PercentRelativeLayout ha quedado en desuso .
La mejor manera de resolverlo ahora es
ConstraintLayout
así:Aquí hay un tutorial sobre cómo agregar
ConstraintLayout
a su proyecto.fuente
Si su vista de imagen está dentro de un diseño de restricción, puede usar las siguientes restricciones para crear una vista de imagen cuadrada
fuente
No puedes hacerlo solo con el diseño, lo he intentado. Terminé escribiendo una clase muy simple para manejarlo, puedes verlo en github. SquareImage.java Es parte de un proyecto más grande pero nada que una pequeña copia y pegue no pueda arreglar (licenciado bajo Apache 2.0)
Esencialmente, solo necesita establecer la altura / ancho igual a la otra dimensión (dependiendo de la forma en que desee escalarlo)
Nota: Puede hacerlo cuadrado sin una clase personalizada utilizando el
scaleType
atributo, pero los límites de la vista se extienden más allá de la imagen visible, lo que hace que sea un problema si coloca otras vistas cerca de ella.fuente
Para configurar su ImageView igual a la mitad de la pantalla, debe agregar lo siguiente a su XML para ImageView:
Para establecer la altura igual a este ancho, debe hacerlo en código. En el
getView
método de suGridView
adaptador, establezca laImageView
altura igual a su ancho medido:fuente
Para las personas que pasan ahora, en 2017, la nueva mejor manera de lograr lo que quieres es usar ConstraintLayout de esta manera:
Y no olvide agregar restricciones a las cuatro direcciones según lo necesite su diseño.
Cree una interfaz de usuario receptiva con RestraintLayout
Además, por ahora, PercentRelativeLayout ha quedado en desuso (consulte la documentación de Android ).
fuente
Así es como resolví ese problema:
preview - imageView con ancho configurado en "match_parent" y scaleType en "cropCenter"
picture: objeto de mapa de bits para establecer en imageView src.
Eso funciona bastante bien para mí.
fuente
= vw*ph/pw
lugar de lo más simple= vw
. (Creo que lo hace para preservar la relación de aspecto de la imagen de la fuente, en lugar de la fuerza una vista previa cuadrado.)No creo que pueda hacerlo en un archivo de diseño XML, y no creo que el
android:scaleType
atributo funcione como usted desea.La única forma sería hacerlo mediante programación. Puede establecer el ancho en fill_parent y puede tomar el ancho de la pantalla como la altura del método
View
o puede usarloView.getWidth()
.fuente
La función ImageView "scaleType" puede ayudarlo aquí.
Este código mantendrá la relación de aspecto y posicionará la imagen en la parte superior:
Aquí hay una gran publicación que muestra las posibilidades y apariencias del uso de scaleType.
ImageView scaleType samples
fuente
me gustó esto
fuente