Quiero descargar una imagen (de tamaño desconocido, pero que siempre es aproximadamente cuadrada) y mostrarla de modo que llene la pantalla horizontalmente y se estire verticalmente para mantener la relación de aspecto de la imagen, en cualquier tamaño de pantalla. Aquí está mi código (que no funciona). Estira la imagen horizontalmente, pero no verticalmente, por lo que se aplasta ...
ImageView mainImageView = new ImageView(context);
mainImageView.setImageBitmap(mainImage); //downloaded from server
mainImageView.setScaleType(ScaleType.FIT_XY);
//mainImageView.setAdjustViewBounds(true);
//with this line enabled, just scales image down
addView(mainImageView,new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
Respuestas:
Logré esto con una vista personalizada. Establezca layout_width = "fill_parent" y layout_height = "wrap_content", y apúntelo al dibujable apropiado:
fuente
Al final, generé las dimensiones manualmente, lo que funciona muy bien:
fuente
Acabo de leer el código fuente
ImageView
y es básicamente imposible sin usar las soluciones de subclases en este hilo. EnImageView.onMeasure
llegamos a estas líneas:Donde
h
yw
son las dimensiones de la imagen, yp*
es el relleno.Y entonces:
Entonces, si tiene un
layout_height="wrap_content"
, se estableceráwidthSize = w + pleft + pright
, o en otras palabras, el ancho máximo es igual al ancho de la imagen.Esto significa que, a menos que establezca un tamaño exacto, las imágenes NUNCA se ampliarán . Considero que esto es un error, pero buena suerte para que Google se dé cuenta o lo solucione. Editar: ¡Comiendo mis propias palabras, envié un informe de error y dicen que se ha solucionado en una versión futura!
Otra solución
Aquí hay otra solución de subclases, pero deberías (en teoría, ¡no la he probado mucho!) Poder usarla en cualquier lugar
ImageView
. Para usarlo, configurelayout_width="match_parent"
ylayout_height="wrap_content"
. También es mucho más general que la solución aceptada. Por ejemplo, puede ajustar tanto a la altura como a la anchura.fuente
La configuración de AdjustViewBounds en verdadero y el uso de un grupo de vista LinearLayout funcionó muy bien para mí. No es necesario realizar una subclase o solicitar métricas de dispositivo:
fuente
He estado luchando con este problema de una forma u otra durante AGES, gracias, gracias, GRACIAS .... :)
Solo quería señalar que puede obtener una solución generalizable de lo que hizo Bob Lee simplemente extendiendo View y anulando onMeasure. De esa manera, puede usar esto con cualquier elemento de diseño que desee y no se romperá si no hay imagen:
fuente
En algunos casos, esta fórmula mágica resuelve maravillosamente el problema.
Para cualquiera que tenga problemas con esto proveniente de otra plataforma, la opción "tamaño y forma para adaptarse" se maneja maravillosamente en Android, pero es difícil de encontrar.
Por lo general, desea esta combinación:
Entonces es automático y sorprendente.
Si eres un desarrollador de iOS, es absolutamente asombroso lo simple que es, en Android, puedes hacer "alturas de celda totalmente dinámicas" en una vista de tabla ... eh, me refiero a ListView. Disfrutar.
fuente
Me las arreglé para lograr esto usando solo este código XML. Puede darse el caso de que eclipse no represente la altura para mostrar que se expande para ajustarse; sin embargo, cuando lo ejecuta en un dispositivo, se procesa correctamente y proporciona el resultado deseado. (Bueno, al menos para mi)
fuente
src
ImageView y se volvió proporcional.Lo hice con estos valores dentro de un LinearLayout:
fuente
Todos están haciendo esto de manera programada, así que pensé que esta respuesta encajaría perfectamente aquí. Este código funcionó para mi en el xml. NO estoy pensando en la proporción todavía, pero aún así quería colocar esta respuesta si pudiera ayudar a alguien.
Salud..
fuente
Una solución muy sencilla es utilizar las funciones proporcionadas por
RelativeLayout
.Aquí está el xml que lo hace posible con Android estándar
Views
:El truco es que configuras el
ImageView
para llenar la pantalla, pero tiene que estar por encima de los otros diseños. De esta forma logras todo lo que necesitas.fuente
¡Es simple cuestión de configuración
adjustViewBounds="true"
yscaleType="fitCenter"
en el archivo XML para ImageView!Nota:
layout_width
está configurado enmatch_parent
fuente
Está configurando ScaleType en ScaleType.FIT_XY. Según los javadocs , esto estirará la imagen para que se ajuste a toda el área, cambiando la relación de aspecto si es necesario. Eso explicaría el comportamiento que está viendo.
Para obtener el comportamiento que desea ... FIT_CENTER, FIT_START o FIT_END están cerca, pero si la imagen es más estrecha que alta, no comenzará a llenar el ancho. Sin embargo, podría ver cómo se implementan y probablemente debería poder averiguar cómo ajustarlo para su propósito.
fuente
ScaleType.CENTER_CROP hará lo que quieras: estirar hasta el ancho completo y escalar la altura en consecuencia. si la altura escalada excede los límites de la pantalla, la imagen se recortará.
fuente
Mira, hay una solución mucho más fácil para tu problema:
fuente
Puede usar mi StretchableImageView conservando la relación de aspecto (por ancho o por alto) dependiendo del ancho y alto del dibujable:
fuente
Para mí, android: scaleType = "centerCrop" no resolvió mi problema. De hecho, amplió la imagen mucho más. Así que probé con android: scaleType = "fitXY" y funcionó excelente.
fuente
Esto funciona bien según mi requisito
<ImageView android:id="@+id/imgIssue" android:layout_width="fill_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY"/>
fuente