Cómo hacer una imagen tan grande como sea posible, manteniendo la relación de aspecto
Tengo una imagen que es más pequeña que el contenedor que me gustaría que encajara dentro de. Me gustaría que la imagen se estire, manteniendo su relación de aspecto, a su mayor tamaño posible.
Para ilustrar este problema:
- Establecer visibilidad de la barra de progreso en la finalización de la carga de la imagen utilizando la biblioteca Glide
- Abra una aplicación de cámara por intención y guardar la imagen en el SD y imageView
- SetColorFilter no funciona
- Android cómo identificar el elemento en listview con casilla de verificación
- MediaStore.Images.Media.getBitmap y fuera de error de memoria
<ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/thumbnail" android:scaleType="fitXY" android:adjustViewBounds="true"/>
El ImageView
anterior se estiraría para llenar el ancho del contenedor. El @drawable
que contenía también se extendería a lo largo del eje x para ajustar el ancho de ImageView
que es perfecto. Sin embargo, el problema es que la dimensión etiquetada wrap_content
, en este caso la altura, permanece el mismo tamaño que la altura inicial del @drawable
.
He leído la documentación relativa a ScaleType aquí y no puedo encontrar la respuesta allí.
La siguiente imagen describe el código anterior:
Current behaviour Desired Behaviour
Editar
Un ImageView
dado scaleType="fitCenter"
ampliará / reducirá con @drawable
el @drawable
dentro de él para crecer lo más grande posible, manteniendo su relación de aspecto.
Las dimensiones de ImageView
s se definen antes de que el @drawable
sea escalado de alguna manera. Las dimensiones de ImageView
no se efectúan por escalado de su contenido @drawable
.
- ¿Cómo resaltar ImageView cuando se enfoca o hace clic?
- Cómo establecer la imagen de url para imageView
- Realizar onClickListener en ImageView en GridView
- Esquinas redondeadas para una vista de imagen en android
- Android: cómo convertir todo ImageView a Bitmap?
- ¿El android: scaleType = "fitCenter" sólo funciona con los atributos fix Layout_width y Layout_height?
- Cómo mostrar emoticonos en Android
- Cómo cargar un ImageView desde un archivo png?
XML
La única solución a esto en XML es usar "match_parent"
o un valor máximo discreto en lugar de "wrap_content"
siempre que sea posible. Esto asegurará que el ImageView
sea el tamaño correcto, lo que significará añadir scaleType="fitCenter"
para asegurar que @drawable
se escalará correctamente.
Programaticamente
Es feo, pero puede cambiar el tamaño de ImageView después de que las dimensiones se han dado valores discretos:
final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail); ViewTreeObserver thumbnailViewVto = thumbnailView.getViewTreeObserver(); thumbnailViewVto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { private boolean changed = false; @Override public void onGlobalLayout() { if(!changed) { Drawable image = getResources().getDrawable(R.drawable.thumbnail); float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight(); int height = thumbnailView.getHeight(); thumbnailView.setLayoutParams( new LayoutParams( (int) (height * heighToWidthRatio), height)); changed = true; } } });
EDITAR
final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail); thumbnailView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // Remove the GlobalOnLayout Listener so it only fires once. thumbnailView.getViewTreeObserver().removeGlobalOnLayoutListener(this) // Find the images Height to Width ratio Drawable image = getResources().getDrawable(R.drawable.thumbnail); float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight(); // Use this ratio to discover the ratio of the ImageView to allow it to perfectly contain the image. int height = thumbnailView.getHeight(); thumbnailView.setLayoutParams(new LayoutParams( (int) (height * heighToWidthRatio), height)); } });
Parece que quieres fitCenter, que utiliza Matrix.ScaleToFit CENTER .
- Ejecución de bytecode Java en Android – Sun JVM en la parte superior de DalvikVM
- Advertencia al cancelar el menú de desbordamiento de ActionBar en Android 4.1.x