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
.
Parece que quieres fitCenter, que usa Matrix.ScaleToFit CENTER .
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));
}
});