574

在 Android 中,我定义了一个ImageView's layout_widthfill_parent它占据了手机的整个宽度)。

如果我放置的图像ImageView大于layout_width,Android 会缩放它,对吗?但是身高呢?当Android缩放图像时,它会保持纵横比吗?

我发现ImageView当 Android 缩放比ImageView. 真的吗?如果是,我怎样才能消除那个空白?

4

26 回答 26

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

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

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

于 2010-03-26T15:07:27.163 回答
305

android:adjustViewBounds

如果您希望 ImageView 调整其边界以保持其可绘制对象的纵横比,请将其设置为 true。

于 2010-07-08T12:08:07.400 回答
194

对于其他有此特定问题的人。您有一个ImageView您希望fill_parent按比例缩放的宽度和高度:

将这两个属性添加到您的ImageView

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

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

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

 android:adjustViewBounds="true"
 android:layout_centerInParent="true"
于 2011-05-26T18:45:03.533 回答
58

如果您想要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);

我花了一段时间才开始工作,但这似乎适用于图像小于屏幕宽度和大于屏幕宽度的情况,并且它不会对图像进行装箱。

于 2012-03-18T18:39:25.950 回答
17

这对我有用:

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"
于 2013-03-28T10:31:36.667 回答
12

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

这会根据图像的纵横比很好地拟合图像并将其保持在中心。

于 2019-06-11T10:27:37.057 回答
10

这解决了我的问题

android:adjustViewBounds="true"
android:scaleType="fitXY"
于 2017-04-24T11:30:27.363 回答
9

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

于 2010-03-26T09:09:56.107 回答
9

下面的代码适用于比例图像作为纵横比:

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);
于 2014-09-12T12:23:56.080 回答
6

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

<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,则它们很可能会被图像重叠。

于 2012-10-02T16:12:39.493 回答
6

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

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

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    />
于 2016-05-05T06:29:00.380 回答
5

如果图像质量下降:使用

android:adjustViewBounds="true"

代替

android:adjustViewBounds="true"
android:scaleType="fitXY"
于 2018-12-20T06:09:06.527 回答
3

对于任何希望图像以适当的缩放比例和不使用裁剪的方式完全适合图像视图的人

imageView.setScaleType(ScaleType.FIT_XY);

其中 imageView 是代表您的 ImageView 的视图

于 2012-12-10T12:14:31.090 回答
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);
于 2015-03-10T12:36:03.247 回答
3

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

imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
于 2017-04-06T19:39:21.613 回答
2

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

android:layout_weight="1"
android:scaleType="fitCenter"
于 2012-08-19T15:33:14.217 回答
2

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

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

关键在于宽度和高度的匹配父级

于 2017-01-17T02:15:03.383 回答
1

我用这个:

<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" />
于 2013-06-26T16:07:16.490 回答
1

尝试使用android:layout_gravityImageView:

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

上面的例子对我有用。

于 2013-08-20T13:11:49.733 回答
1

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

希望这可以帮助别人!

于 2014-04-08T08:29:21.050 回答
1

通过您的 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);
    }

于 2016-01-04T13:24:44.460 回答
1

以编程方式将纵横比应用于 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);
于 2020-12-01T12:15:21.060 回答
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>
于 2018-11-07T20:23:51.453 回答
0

您可以缩放图像,这也将减小图像的大小。它有一个库,您可以下载和使用它。 https://github.com/niraj124124/Images-Files-scale-and-compress.git

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

于 2019-01-29T20:16:02.077 回答
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" />
于 2020-03-01T17:03:18.593 回答
-5
imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false));
于 2013-08-24T09:28:07.990 回答