relacion pixeles fotografia formato convertir como cambiar calculadora aspecto android android-layout imageview

android - pixeles - Cómo hacer una imagen lo más grande posible manteniendo la relación de aspecto



relacion de aspecto 16 9 en pixeles (2)

Tengo una imagen más pequeña que el contenedor en el que me gustaría que encajara. Me gustaría que la imagen se extienda, manteniendo su relación de aspecto, hasta su tamaño más grande 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 ajustarse al ancho de ImageView que es perfecto. Sin embargo, el problema es que la dimensión etiquetada wrap_content , en este caso altura, sigue siendo del mismo tamaño que la altura inicial de @drawable .

He leído la documentación sobre ScaleType here 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" expandirá / encogerá con @drawable el @drawable dentro de él para que crezca lo más posible al tiempo que conserva su relación de aspecto.

Las dimensiones de ImageView se definen antes de que se @drawable escalar @drawable de alguna manera. Las dimensiones de ImageView no se ven afectadas por la escala de lo que contiene @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" cuando sea posible. Esto asegurará que ImageView tenga el tamaño correcto, lo que significará que al agregar scaleType="fitCenter" se asegurará que @drawable se escalará correctamente.

Programáticamente

Es feo, pero puede cambiar el tamaño de ImageView después de que sus dimensiones hayan recibido 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)); } });