如何在ImageView中缩放图像以保持纵横比

在Android中,我将ImageViewlayout_width定义为fill_parent(占据了手机的整个宽度)。

如果我放入ImageView的图像比layout_width大,Android会缩放它,对吧?那么高度呢?当Android缩放图像时,它会保持纵横比吗?

我发现的是,当Android缩放一个比ImageView大的图像时,ImageView的顶部和底部有一些空白。这是真的吗?如果是,我如何消除空白?

710371 次浏览

看一下ImageView。ScaleType来控制和理解在ImageView中调整大小的方式。当图像调整大小时(同时保持其纵横比),图像的高度或宽度可能会小于ImageView的尺寸。

  1. 是的,默认情况下Android会缩小你的图像以适应ImageView,保持纵横比。但是,请确保使用android:src="..."而不是android:background="..."将图像设置为ImageView。src=使它缩放图像保持纵横比,但background=使它缩放而且扭曲图像,使它完全适合ImageView的大小。(你可以同时使用背景和源,这对于显示主图像周围的框架等事情很有用,只使用一个ImageView。)

  2. 你还应该看到android:adjustViewBounds使ImageView调整自身大小以适应重新缩放的图像。例如,如果你有一个矩形图像,通常是一个正方形的ImageView, adjustViewBounds=true将使它调整ImageView的大小为矩形。这将影响其他视图围绕ImageView的布局。

    然后,正如Samuh所写的,您可以使用android:scaleType参数更改默认缩放图像的方式。顺便说一下,发现这是如何工作的最简单的方法就是自己做一些实验!只需记住查看模拟器本身(或实际手机)中的布局,因为Eclipse中的预览通常是错误的。

看到# EYZ1。

如果你想让ImageView调整它的边界来保留它的可绘制对象的纵横比,将此设置为true。

给其他有这种问题的人。你有一个ImageView,你想有一个宽度为fill_parent和高度按比例缩放:

添加这两个属性到你的ImageView:

android:adjustViewBounds="true"
android:scaleType="centerCrop"

设置ImageView宽度为fill_parent,高度为wrap_content

另外,如果你不想让你的图像被裁剪,试试这个:

 android:adjustViewBounds="true"
android:layout_centerInParent="true"

如果你想要一个既能放大又能缩小的ImageView,同时又能保持适当的宽高比,把这个添加到你的XML中:

android:adjustViewBounds="true"
android:scaleType="fitCenter"

在代码中添加:

// We need to adjust the height if the width of the bitmap is
// smaller than the view width, otherwise the image will be boxed.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);

我花了一段时间才让它工作,但这似乎在图像小于屏幕宽度和大于屏幕宽度的情况下都可以工作,而且它不会将图像框起来。

如果你想让你的图像占据尽可能大的空间,那么最好的选择是

android:layout_weight="1"
android:scaleType="fitCenter"

我的图像比屏幕小。为了让它按比例拉伸到最大,并在视图中居中,我必须使用以下代码:

<ImageView
android:id="@+id/my_image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"
android:adjustViewBounds="true"
android:layout_weight="1"
android:scaleType="fitCenter" />

记住,如果你有一个相对布局,有一些元素被设置在ImageView的上方或下方,它们很可能会被图像重叠。

对于你们中的任何人,想要图像精确地适应imageview适当缩放,不裁剪使用

imageView.setScaleType(ScaleType.FIT_XY);

imageView是代表你的imageView的视图

这招对我很管用:

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"

我用这个:

<ImageView
android:id="@+id/logo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"
android:scaleType="centerInside"
android:src="@drawable/logo" />

尝试使用android:layout_gravity为ImageView:

android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center_vertical|center_horizontal"
android:layout_weight="1"

上面的例子对我很有用。

imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false));

我有一个算法缩放位图,以最适合容器的尺寸,保持其纵横比。请找到我的解决方案在这里

希望这能帮助到路上的人!

以下代码用于缩放图像作为纵横比:

Bitmap bitmapImage = BitmapFactory.decodeFile("Your path");
int nh = (int) ( bitmapImage.getHeight() * (512.0 / bitmapImage.getWidth()) );
Bitmap scaled = Bitmap.createScaledBitmap(bitmapImage, 512, nh, true);
your_imageview.setImageBitmap(scaled);

你可以计算屏幕宽度。你可以缩放位图。

 public static float getScreenWidth(Activity activity) {
Display display = activity.getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
float pxWidth = outMetrics.widthPixels;
return pxWidth;
}

计算屏幕宽度和按屏幕宽度缩放的图像高度。

float screenWidth=getScreenWidth(act)
float newHeight = screenWidth;
if (bitmap.getWidth() != 0 && bitmap.getHeight() != 0) {
newHeight = (screenWidth * bitmap.getHeight()) / bitmap.getWidth();
}

之后就可以缩放位图了。

Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true);

传递你的ImageView,根据屏幕的高度和宽度,你可以做出它

    public void setScaleImage(EventAssetValueListenerView view){
// Get the ImageView and its bitmap
Drawable drawing = view.getDrawable();
Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
// Get current dimensions
int width = bitmap.getWidth();
int height = bitmap.getHeight();


float xScale = ((float) 4) / width;
float yScale = ((float) 4) / height;
float scale = (xScale <= yScale) ? xScale : yScale;


Matrix matrix = new Matrix();
matrix.postScale(scale, scale);


Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
BitmapDrawable result = new BitmapDrawable(scaledBitmap);
width = scaledBitmap.getWidth();
height = scaledBitmap.getHeight();


view.setImageDrawable(result);


LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
params.width = width;
params.height = height;
view.setLayoutParams(params);
}

使用ImageView中的这些属性来保持纵横比:

android:adjustViewBounds="true"
android:scaleType="fitXY"


<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitXY"
/>

你不需要任何java代码。你只需要:

<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop" />

键在width和height的匹配父项中

当以编程方式执行此操作时,请确保以正确的顺序调用setter:

imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)

这解决了我的问题

android:adjustViewBounds="true"
android:scaleType="fitXY"

在使用# eyz0为舍入imageview和固定android:layout_height为标题的情况下,我用Glide加载图像

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="220dp"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
>


<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center|top"
card_view:cardBackgroundColor="@color/colorPrimary"
card_view:cardCornerRadius="10dp"
card_view:cardElevation="10dp"
card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true">


<ImageView
android:adjustViewBounds="true"
android:maxHeight="220dp"
android:id="@+id/iv_full"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitCenter"/>


</android.support.v7.widget.CardView>
</FrameLayout>

如果图像质量下降: 使用< / p >

android:adjustViewBounds="true"

而不是

android:adjustViewBounds="true"
android:scaleType="fitXY"

你可以缩放图像,这也将减少你的图像的大小。 你可以下载并使用它的库。 # EYZ0 < / p >

如何使用 1)导入压缩器-v1.0。Jar到您的项目。 2)添加下面的示例代码进行测试。 ResizeLimiter resize = ImageResizer.build(); 调整大小。scale("inputImagePath", "outputImagePath",imageWidth, imageHeight); 根据您的需求,还有更多的方法

这是它在ConstraintLayout中为我工作的方式:

<ImageView
android:id="@+id/myImg"
android:layout_width="300dp"
android:layout_height="300dp"
android:scaleType="fitCenter"
android:adjustViewBounds="true"/>

然后在代码中,我设置drawable为:

ImageView imgView = findViewById(R.id.myImg);
imgView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.image_to_show, null));

这很好地符合图像的长宽比,并保持它在中心。

快速回答:

<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="center"
android:src="@drawable/yourImage"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

以编程方式应用宽高比到Imageview:

aspectRatio = imageWidth/imageHeight
ratioOfWidth = imageWidth/maxWidth
ratioOfHeight = imageHeight/maxHeight




if(ratioOfWidth > ratioOfHeight){​​​​​​​
imageWidth = maxWidth
imageHeight = imageWidth/aspectRatio
}​​​​​​​ else if(ratioOfHeight > ratioOfWidth){​​​​​​​
imageHeight = maxHeight
imageWidth = imageHeight * aspectRatio
}​​​​​​​

之后,您可以使用缩放位图图像视图

Bitmap scaledBitmap= Bitmap.createScaledBitmap(bitmap, (int) imageWidth , (int) imageHeight , true);