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

时间:2010-03-26 08:41:16

标签: android android-imageview image-scaling

在Android中,我将ImageView的{​​{1}}定义为layout_width(占据了手机的整个宽度)。

如果我放到fill_parent的图片大于ImageView,Android会缩放它,对吗?但身高呢?当Android缩放图像时,它会保持宽高比吗?

我发现,当Android缩放比layout_width更大的图像时,ImageView的顶部和底部会有一些空白区域。真的吗?如果是,我该如何消除那个空格呢?

27 个答案:

答案 0 :(得分:745)

  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中的预览通常是错误的。

答案 1 :(得分:268)

请参阅android:adjustViewBounds

  

如果希望ImageView调整其边界以保持其drawable的宽高比,请将此项设置为true。

答案 2 :(得分:159)

对于遇到此特定问题的其他人。您有一个ImageView(或其他View),您希望宽度为fill_parent,并且高度按比例缩放:

将这两个属性添加到ImageView

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

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

此外,如果您不希望裁剪图像,请尝试以下操作:

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

答案 3 :(得分:53)

如果您希望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);

我花了一些时间来完成这项工作,但这似乎适用于图像小于屏幕宽度且大于屏幕宽度的情况,并且它不会对图像进行包装。

答案 4 :(得分:11)

这对我有用:

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

答案 5 :(得分:8)

以下代码将缩放图像用作宽高比:

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

答案 6 :(得分:7)

这解决了我的问题

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

答案 7 :(得分:7)

请查看ImageView.ScaleType来控制并了解ImageView中调整大小的方式。调整图像大小(同时保持其宽高比)时,图像的高度或宽度可能会小于ImageView的尺寸。

答案 8 :(得分:5)

在ImageView中使用这些属性以保持宽高比:

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

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

答案 9 :(得分:4)

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

<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的上方或下方,则它们很可能会与图像重叠。

答案 10 :(得分:3)

对于任何希望图像与图像视图完全匹配并且没有适当缩放并且不使用裁剪的人

imageView.setScaleType(ScaleType.FIT_XY);

其中imageView是表示ImageView的视图

答案 11 :(得分:3)

如果图像质量下降,则: 使用

android:adjustViewBounds="true"

代替

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

答案 12 :(得分:3)

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

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

答案 13 :(得分:3)

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

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

答案 14 :(得分:2)

如果您希望图像占用最大可能空间,那么最佳选择是

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

答案 15 :(得分:1)

我有一个算法可以将位图缩放到bestFit容器尺寸,保持其纵横比。请找到我的解决方案here

希望这可以帮助有人走下车道!

答案 16 :(得分:1)

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

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

键位于宽度和高度的匹配父级

答案 17 :(得分:1)

尝试将android:layout_gravity用于ImageView:

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

上面的例子对我有用。

答案 18 :(得分:0)

传递ImageView并根据屏幕高度和宽度进行设置

function highlightWords($string, $marker){
    $string = preg_replace("/(\b" . preg_quote($marker, "/") . "\b)/i", "<span class='highlight success'>$1</span>", $string);
    return $string;
}

答案 19 :(得分:0)

在使用cardview舍入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>

答案 20 :(得分:0)

我用这个:

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

答案 21 :(得分:0)

您可以缩放图像,这也会减小图像的尺寸。 您可以下载并使用它的库。 https://github.com/niraj124124/Images-Files-scale-and-compress.git

使用方法 1)导入压缩机v1.0。罐到您的项目。 2)添加以下示例代码进行测试。     ResizeLimiter resize = ImageResizer.build();     resize.scale(“ inputImagePath”,“ outputImagePath”,imageWidth,imageHeight); 根据您的要求还有更多方法

答案 22 :(得分:0)

这是在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));

这将根据其宽高比很好地拟合图像并将其保持在中心位置。

答案 23 :(得分:0)

快速解答:

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

答案 24 :(得分:0)

以编程方式将纵横比应用于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);

答案 25 :(得分:-1)

myImageView.setAdjustViewBounds(true);

答案 26 :(得分:-3)

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