Android ImageView:适合宽度


73

我下载图片并将其动态设置为屏幕背景Imageview。我尝试过ScaleType缩放图像。

如果图像高度大于宽度,则大ScaleTypes fitStartfitEnd并且fitCenter不工作。Android会缩小照片并根据高度进行调整,但我看到一些多余的空白作为宽度的一部分。

我想根据宽度缩小照片,使其适合宽度,并且我不在乎是否有一些额外的空白作为高度的一部分,或者如果高度过长,可以将其超出视野范围(如果可能的话?)。

ScaleType.XY缩放照片并适合其中的所有内容,ImageView并且不在乎图像的高度/重量比。

<ImageView 
                android:id="@+id/background"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:adjustViewBounds="true"
                android:scaleType="fitStart"
            />

Answers:


194

我最终使用了以下代码:

<ImageView 
                android:id="@+id/background"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:adjustViewBounds="true"
                android:scaleType="centerCrop"
                android:src="@drawable/name"
            />

确保使用src代替设置图像background


2
不过这不是成比例的,只是裁剪图像以使其适合...我该如何解决?
Ruchir Baronia 2015年

哦好的。感谢您的回应。因此不可能在屏幕上按比例放置图像?
Ruchir Baronia 2015年

你建议我做什么?我想在我的应用中显示一张图片(全屏)。图像显得拉长。有没有什么办法解决这一问题?非常感谢!
Ruchir Baronia 2015年

3
@Sharj据我所知,它"fitCenter"不是"centerFit"
杰克逊(Jacksonkr)

@ sharj.Thanks它使我高兴
iCoders


13

该发现优雅的解决方案在这里会像为你的魅力。

基本上,您只需要创建一个扩展的小类,ImageView并简单地重写该onMeasure方法即可根据需要调整宽度和高度。在这里,它使用以下方法缩放以适合宽度:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth();
    setMeasuredDimension(width, height);
}

您将使用以下特殊代码ImageView

<your.activity.package.AspectRatioImageView 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_vertical"
    android:src="@drawable/test" />

我有一个ListView,其中包含即时下载的图像。因此,适配器使用ImageView返回一个布局,该布局的大小可以动态更改。这是唯一对我有用的方法。谢谢。
丹尼斯K

这一点都不优雅,这很hacky。查看接受的答案。
mpellegr

9

有一种简单的方法,如果您只想填充屏幕的宽度并与高度成比例(并知道图像的比例),则可以在OnCreate()中执行以下操作:

setContentView(R.layout.truppview_activity);
trupImage = (ImageView) findViewById(R.id.trupImage);

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
float scWidth = outMetrics.widthPixels;
trupImage.getLayoutParams().width = (int) scWidth;
trupImage.getLayoutParams().height = (int) (scWidth * 0.6f);

比率调整为0.6(如果您知道图像的w和h,当然也可以自动计算)。

PS:
这是XML方面:

  <ImageView
        android:id="@+id/trupImage"
        android:layout_width="match_parent"
        android:background="@color/orange"
        android:layout_height="match_parent" 
        android:adjustViewBounds="true" 
        android:scaleType="fitCenter" />

5

这对我有用。

创建一个扩展ImageView的类

    package com.yourdomain.utils;

    import android.content.Context;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.widget.ImageView;

    public class ResizableImageView extends ImageView {

        public ResizableImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        @Override 
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            Drawable d = getDrawable();

            if (d != null) {
                int width = MeasureSpec.getSize(widthMeasureSpec);
                int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
                setMeasuredDimension(width, height);
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        }
    }

在xml中使用以下内容代替ImageView

    <com.yourdomain.utils.ResizableImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/test" />

1

我认为您无法仅使用XML进行操作,需要调整自身的大小(位图)

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();

        try {
            ((ImageView) findViewById(R.id.background))
                    .setImageBitmap(ShrinkBitmap(width));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

然后

private Bitmap ShrinkBitmap(int width)
        throws FileNotFoundException {

    BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
    bmpFactoryOptions.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
            R.drawable.img, bmpFactoryOptions);
    int widthRatio = (int) android.util.FloatMath
            .ceil(bmpFactoryOptions.outWidth / (float) width);


    bmpFactoryOptions.inSampleSize = widthRatio;



    if (bmpFactoryOptions.inSampleSize <= 0)
        bmpFactoryOptions.inSampleSize = 0;
    bmpFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
    bmpFactoryOptions.inJustDecodeBounds = false;
    bitmap = BitmapFactory.decodeResource(getResources(),
            R.drawable.img, bmpFactoryOptions);
    return bitmap;

}

和布局

 <ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/background"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
  />

1

如果要适合整个父块
的图像,它将拉伸图像

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY" 

如果您想让整个父图像都适合原始比例的图像
,则会裁剪掉图像的某些部分

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:adjustViewBounds="true"
        android:scaleType="centerCrop"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.