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:
- RelativeLayout no muestra todos los botones
- ¿Cómo puedo configurar la imagen de fondo con picasso en el código
- ¿Por qué tengo espacio en blanco en la parte superior y en la parte inferior de mi ImageView en mi RelativeLayout?
- Mantenga la altura de RelativeLayout tan pequeña como sea posible, pero aumente la altura de los niños para llenar todo el espacio disponible
- Layout_below elemento dentro del diseño incluido
<?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.
- Disposiciones anidadas de Android
- ¿Por qué la gravedad no funciona cuando se aplica al diseño relativo?
- RelativeLayout: alinear la vista con el hijo del grupo de vista de hermanos
- Cómo establecer la misma altura en RelativeLayout?
- RelativeLayout, alinee una vista en la parte inferior de otra vista pero siempre debajo de otra
- OnTouch dando extraños puntos de contacto Android
- Android multiline edittext no aumentar su altura como los tipos de usuario
- Android: mostrar / ocultar una vista utilizando una animación
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
-
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
-
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)
-
fitCenter
-
fitEnd
-
fitStart
-
fitXY
-
matrix
Escala utilizando la matriz de imagen al dibujar
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.
- El primer lanzamiento de la Actividad con Google Maps es muy lento
- ¿Cómo hago algo cuando termina una animación?