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:

<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:

Introduzca aquí la descripción de la imagenIntroduzca aquí la descripción de la imagen

  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 .

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 .

  • OutOfMemoryError: Usando una imagen que es 1080 * 1920 haga la página de bienvenida
  • Android: cambiar el tamaño de la vista de la imagen en XML
  • Android agrega imagen de flecha a spinner
  • Android ImageView escalado confict
  • Establecer alfa en ImageView sin setAlpha
  • Clase Android ImageViewer que admite Pinch-Zoom y desplazamiento
  • Android: OutofMemoryError: el tamaño de mapa de bits supera el presupuesto de VM sin ninguna razón que pueda ver
  • ¿Cómo puedo guardar un ImageView como una imagen?
  • Cómo crear un ImageView circular en Android?
  • BaseAdapter y ContextMenu
  • Java Android - recorte Imagen en ImageView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.