ImageView填充父宽度或高度,但保持宽高比

我有一个方形图像(虽然这个问题也适用于矩形图像)。 我希望尽可能大地展示图片,如有必要可以展开图片,以填充父母,同时保持高宽比。 图像比ImageView小。 问题是,我无法拉伸图像,并“匹配”ImageView的高度和宽度。

这是我的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> 

我已经使用fill_parentwrap_content和多个缩放types的许多组合: fitCenterfitStartfitEndcenterInside ,它们都以正确的高宽比绘制图像,但是没有一个实际缩放图像和ImageView本身 ,导致TextViews被一路推下屏幕,ImageView里面的空白,图像没有缩放或图像被裁剪。

我不能完全确定这个合适的组合。

这些:

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

应调整图像大小并更改边界的大小以适应新的图像大小。 如果它没有在你的设备上发布你正在使用的图像和你正在testing的设备。

使用此代码: android:scaleType="fitXY"

有关图像缩放的更多细节,请看这篇文章中的动作

概要:

  • center

将图像置于视图中央,但不执行缩放

在这里输入图像说明

  • centerCrop

均匀缩放图像(保持图像的高宽比),以使图像的两个尺寸(宽度和高度)等于或大于视图的相应尺寸(减去填充)。 图像然后居中在视图中

在这里输入图像说明

  • centerInside

均匀缩放图像(保持图像的宽高比),使图像的两个尺寸(宽度和高度)等于或小于视图的相应尺寸(减去填充)

在这里输入图像说明

  • fitCenter

在这里输入图像说明

  • fitEnd

在这里输入图像说明

  • fitStart

在这里输入图像说明

  • fitXY

在这里输入图像说明

  • matrix

绘图时使用图像matrix进行缩放

在这里输入图像说明

这里更详细的新文章

将此代码与视图布局参数一起用作wrapcontent

机器人:adjustViewBounds = “真”

希望这会起作用。

你有没有试图调整它programmaticaly? 如果计算TextView的高度,并基于此调整图像的高度和宽度,我认为它工作得很好。

 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); } 

我有同样的问题,android:adjustViewBounds不做它的工作,并在图像的顶部填充。 进入一个相对宽度和高度都有match_parent值的布局,我有:

  <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" ... 

我改变了相对布局线性布局与宽度和高度的wrap_content值现在可以:

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

这个XML代码将工作! 如果您指定应用宽度始终与窗口相同,则android:adjustViewBounds="true"将根据图像比例设置高度。

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

在imageview中设置android:layout_height="wrap_content" 。 要创build宽度等于屏幕宽度的图像,并根据宽高比按比例设置高度,请执行以下操作。 在这里我提到如何将图像从url加载到imageview。

 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); } }); 

希望这可以帮助。