Imageview height como wrap_content de la imagen mostrada

Quiero que el ancho de un ImageView sea establecido por el padre y la altura debe ser proporcional al aspecto. Las razones para esto es que a continuación se muestra un TextView que quiero colocar justo debajo del ImageView.

Puedo obtener la imagen para mostrar correctamente usando

android:layout_width="fill_parent" android:layout_height="fill_parent" 

Sin embargo la altura de ImageView se convierte en la altura de padre que es mucho mayor que la de la imagen estirada mostrada. Una idea era hacer a los padres más pequeños verticalmente, pero .. allí todavía no sé el tamaño de la imagen estirada.

Lo siguiente no funciona porque una imagen pequeña no se rellena horizontalmente.

 android:layout_width="fill_parent" android:layout_height="wrap_content" 

Jugando con

 android:layout_height="wrap_content" 

Para el RelativeLayout que lo rodea todo no ayuda. También intentó FrameLayout y LinearLayout y falló.

¿Algunas ideas?

Tienes que establecer adjustViewBounds a true.

 imageView.setAdjustViewBounds(true); 

Hay dos casos si su tamaño de imagen real es igual o más grater que su anchura de ImageView y altura entonces usted puede utilizar la propiedad de adjustViewBounds y si su tamaño real de la imagen es menos que ImageView anchura y altura que utiliza la propiedad de scaleType a la imagen demostrada en ImageView basado en su requisito.

1. El tamaño de la imagen real es igual o más grueso que el tamaño y la altura requeridos por ImageView.

 <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:src="@drawable/ic_launcher"/> 

2. El tamaño de la imagen actual es menor que el tamaño y la altura requeridos por ImageView.

 <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="fitXY" android:src="@drawable/ic_launcher"/> 

Así que he tenido el mismo problema más de una vez y mirando a través de las respuestas stackoverflow existentes se han dado cuenta de que ninguna respuesta da una explicación perfecta para la confusión real con respecto a una solución a este problema. Así que aquí tienes:

API 17+

imageView.setAdjustViewBounds(true);

OR (en XML)

android:adjustViewBounds="true"

Resuelve el problema, funciona sin importar el tamaño real del recurso de imagen, es decir, escalará su imagen hacia arriba o hacia abajo al tamaño deseado que tenga en su diseño.

Debajo del API 17

Debajo API 17 android:adjustViewBounds="true" sólo funcionará para encoger una imagen, no crecer, es decir, si la altura real de la fuente de la imagen es menor que las dimensiones que está intentando lograr en su diseño, wrap_content usará esa altura más pequeña Y no escala "arriba" (agrande) la imagen como usted desea.

Y para API 17 y menor, no tiene más remedio que usar un ImageView personalizado para lograr este comportamiento. Usted puede escribir un Custom ImageView usted mismo o utilizar una biblioteca, que ya ha hecho ese trabajo.

Uso de una biblioteca

Probablemente hay más de una biblioteca que corrige este problema, uno de ellos es:

compile 'com.inthecheesefactory.thecheeselibrary:adjustable-imageview:1.0.0'

Que se utiliza de esta manera:

 <com.inthecheesefactory.thecheeselibrary.widget.AdjustableImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:src="@drawable/your_drawable"/> 

Uso de una vista personalizada

Alternativamente al uso de una biblioteca existente, puede escribir una vista personalizada usted mismo, por ejemplo:

 import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.ImageView; public class ScalableImageView extends ImageView { boolean adjustViewBounds; public ScalableImageView(Context context) { super(context); } public ScalableImageView(Context context, AttributeSet attrs) { super(context, attrs); } public ScalableImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void setAdjustViewBounds(boolean adjustViewBounds) { this.adjustViewBounds = adjustViewBounds; super.setAdjustViewBounds(adjustViewBounds); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Drawable drawable = getDrawable(); if (drawable == null) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); return; } if (adjustViewBounds) { int drawableWidth = drawable.getIntrinsicWidth(); int drawableHeight = drawable.getIntrinsicHeight(); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); if (heightMode == MeasureSpec.EXACTLY && widthMode != MeasureSpec.EXACTLY) { int height = heightSize; int width = height * drawableWidth / drawableHeight; if (isInScrollingContainer()) setMeasuredDimension(width, height); else setMeasuredDimension(Math.min(width, widthSize), Math.min(height, heightSize)); } else if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY) { int width = widthSize; int height = width * drawableHeight / drawableWidth; if (isInScrollingContainer()) setMeasuredDimension(width, height); else setMeasuredDimension(Math.min(width, widthSize), Math.min(height, heightSize)); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } private boolean isInScrollingContainer() { ViewParent parent = getParent(); while (parent != null && parent instanceof ViewGroup) { if (((ViewGroup) parent).shouldDelayChildPressedState()) { return true; } parent = parent.getParent(); } return false; } } 

… que utilizaría de la siguiente manera (XML):

 <com.YOUR_PACKE_NAME.ScalableImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:src="@drawable/your_drawable" /> 

Ésta era la única manera que podía conseguirla que trabajaba, para tener el segundo ImageView en el centro y más pequeño que el primer ImageView, y el TextView debajo del segundo ImageView.

Desafortunadamente, utiliza el tamaño de imagen fijo "200dp" en el segundo ImageView, por lo que no tiene el mismo aspecto en dispositivos de diferentes tamaños.

También destruye mi ViewFlipper, ya que cualquier Layout que probé en el segundo ImageView y el TextView los hace mover o cambiar el tamaño.

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/imageview1" android:contentDescription="@string/desc" android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/background" /> <ImageView android:id="@+id/imageview2" android:layout_centerInParent="true" android:contentDescription="@string/desc" android:layout_height="200dp" android:layout_width="200dp" android:adjustViewBounds="true" android:src="@drawable/image2" /> <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_below="@id/imageview2" android:paddingLeft="8dp" android:paddingRight="8dp" android:gravity="center" android:textSize="26sp" android:textColor="#333" android:background="#fff" android:text="this is the text under the image right here" /> </RelativeLayout> 
  • Haga que el tamaño del botón de imagen siempre sea un cuadrado. Androide
  • Visualización de una imagen más grande que la pantalla del dispositivo
  • ¿Cómo obtengo diferentes posiciones de clic en un solo ImageView
  • ImageView en ListView que amplía el ancho máximo
  • Tiempo de aumento de OnLongPress
  • Cómo ampliar una vista de texto en android?
  • Impedir que ImageView empuje las vistas fuera de la pantalla
  • Mostrar ImageView de forma programática
  • Dibujo de una cabeza de flecha en android
  • Gif no animado en el listview personalizado
  • Resalte azul sobre un ImageView cuando el usuario lo toque
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.