ImageView rellena el ancho o altura de los padres, pero mantiene la relación de aspecto

Tengo una imagen cuadrada (aunque este problema también se aplica a las imágenes rectangulares). Quiero mostrar la imagen lo más grande posible, estirándolos si es necesario, para llenar a sus padres, manteniendo la relación de aspecto. La imagen es más pequeña que ImageView. El problema es que no puedo estirar la imagen y "igualar" la altura y el ancho del ImageView.

Este es mi archivo de diseño XML:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="10dp"> <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="fill_parent" android:adjustViewBounds="true" android:scaleType="fitCenter" android:layout_marginTop="10dp"/> <TextView android:id="@+id/name" android:layout_below="@id/image" android:layout_alignLeft="@id/image" android:layout_marginTop="20dp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="18dp"/> <TextView android:id="@+id/name2" android:layout_below="@id/name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="14dp"/> </RelativeLayout> 

He utilizado muchas combinaciones de fill_parent , wrap_content con múltiples scaleTypes: fitCenter , fitStart , fitEnd , centerInside , y todos dibujan las imágenes en la relación de aspecto correcta, pero ninguna de ellas escala las imágenes y el propio ImageView , lo que resulta en Los TextViews se empujan hasta el fondo de la pantalla, espacios en blanco dentro de ImageView, imagen no escalada o imagen recortada.

No puedo calcular la combinación correcta para esto.

Estas:

 android:layout_height="wrap_content" android:scaleType="fitStart" android:adjustViewBounds="true" 

Debe cambiar el tamaño de la imagen y cambiar el tamaño de los límites para ajustarse al nuevo tamaño de la imagen. Si no lo hace en su dispositivo, publique la imagen que está utilizando y el dispositivo en el que está probando.

Utilice este código: android:scaleType="fitXY"

Para obtener más detalles acerca de la escala de imagen, vea lo que se indica en este artículo aquí

Resumen:

  • center

Centrar la imagen en la vista, pero no realizar escalado

Introduzca aquí la descripción de la imagen

  • centerCrop

Escale uniformemente la imagen (mantenga la relación de aspecto de la imagen) de modo que ambas dimensiones (anchura y altura) de la imagen sean iguales o mayores que la dimensión correspondiente de la vista (menos relleno). La imagen se centra entonces en la vista

Introduzca aquí la descripción de la imagen

  • centerInside

Escale uniformemente la imagen (mantenga la relación de aspecto de la imagen) de modo que ambas dimensiones (anchura y altura) de la imagen sean iguales o menores que la dimensión correspondiente de la vista (menos relleno)

Introduzca aquí la descripción de la imagen

  • fitCenter

Introduzca aquí la descripción de la imagen

  • fitEnd

Introduzca aquí la descripción de la imagen

  • fitStart

Introduzca aquí la descripción de la imagen

  • fitXY

Introduzca aquí la descripción de la imagen

  • matrix

Escala utilizando la matriz de imagen al dibujar

Introduzca aquí la descripción de la imagen

Más detalles aquí nuevo artículo

Utilice este código con parámetros de diseño de vista como wrapcontent

Android: adjustViewBounds = "true"

Espero que esto funcione.

¿Trató de ajustarlo programáticamente? Creo que funciona muy bien si se calcula la altura de su TextView s y ajustar la altura y el ancho de la imagen sobre la base de esto.

 private void adjustImageView() { //Get the display dimensions DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); //TextView name TextView name = (TextView) findViewById(R.id.name); name.setText("your name text goes here"); name.measure(0, 0); //name TextView height int nameH = name.getMeasuredHeight(); //TextView name2 TextView name2 = (TextView) findViewById(R.id.name2); name2.setText("your name2 text goes here"); name2.measure(0, 0); //name2 TextView height int name2H = name2.getMeasuredHeight(); //Original image Bitmap imageOriginal = BitmapFactory.decodeResource(getResources(), R.drawable.image); //Width/Height ratio of your image float imageOriginalWidthHeightRatio = (float) imageOriginal.getWidth() / (float) imageOriginal.getHeight(); //Calculate the new width and height of the image to display int imageToShowHeight = metrics.heightPixels - nameH - name2H; int imageToShowWidth = (int) (imageOriginalWidthHeightRatio * imageToShowHeight); //Adjust the image width and height if bigger than screen if(imageToShowWidth > metrics.widthPixels) { imageToShowWidth = metrics.widthPixels; imageToShowHeight = (int) (imageToShowWidth / imageOriginalWidthHeightRatio); } //Create the new image to be shown using the new dimensions Bitmap imageToShow = Bitmap.createScaledBitmap(imageOriginal, imageToShowWidth, imageToShowHeight, true); //Show the image in the ImageView ImageView image = (ImageView) findViewById(R.id.image); image.setImageBitmap(imageToShow); } 

Tuve el mismo problema, android: adjustViewBounds no hacer su trabajo y tener un relleno en la parte superior de la imagen. En un diseño relativo que tenía valores match_parent para el ancho y la altura, tenía:

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/transparent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitStart" android:adjustViewBounds="true" ... 

Cambié la disposición relativa a una disposición linear con los valores del wrap_content para el ancho y la altura y ahora está bien:

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" 

Establecer android:layout_height="wrap_content" en la vista de la imagen. Para crear una imagen con ancho igual al ancho de la pantalla, y la altura proporcionalmente establecida de acuerdo con la relación de aspecto, haga lo siguiente. Aquí menciono cómo cargar imagen a imageview de url.

 Glide.with(context).load(url).asBitmap().into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { // creating the image that maintain aspect ratio with width of image is set to screenwidth. int width = imageView.getMeasuredWidth(); int diw = resource.getWidth(); if (diw > 0) { int height = 0; height = width * resource.getHeight() / diw; resource = Bitmap.createScaledBitmap(resource, width, height, false); } imageView.setImageBitmap(resource); } }); 

Espero que esto ayude.

  • Androide - superponer imágenes (jugar a las cartas)
  • Establecimiento de subvases en un diseño mediante programación
  • Android ScrollView no funciona correctamente
  • Método Onlayout en el diseño personalizado extendiendo RelativeLayout
  • Disposición relativa: comportamiento diferente en Api <11
  • "FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS" afecta a getRootView (). GetHeight ()
  • Cree un nuevo TextView mediante programación y luego muéstrelo debajo de otro TextView
  • Problemas con relleno en RelativeLayout
  • Las dependencias circulares no pueden existir en RelativeLayout, android?
  • Android RelativeLayout, espaciamiento igual?
  • Cómo anclar un botón en la parte inferior de un diseño relativo en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.