Android:如何在保持宽高比的同时将图像拉伸到屏幕宽度?

119

我想下载一张大小未知但总是大致上是正方形的图片,并将其显示在屏幕上,使其水平填满屏幕,垂直拉伸以保持图像的纵横比,在任何屏幕尺寸下都能实现。这是我的(不起作用的)代码。它可以水平拉伸图像,但不能垂直拉伸,因此它被压缩了...

ImageView mainImageView = new ImageView(context);
    mainImageView.setImageBitmap(mainImage); //downloaded from server
    mainImageView.setScaleType(ScaleType.FIT_XY);
    //mainImageView.setAdjustViewBounds(true); 
    //with this line enabled, just scales image down
    addView(mainImageView,new LinearLayout.LayoutParams( 
            LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

所有的安卓设备的宽高比都完全相同吗?如果不是,那么要想将图像按照原始比例缩放以适应整个宽度/高度是不可能的。 - NoozNooz42
4
不,我不希望图片填满屏幕,只需按比例缩放至屏幕宽度即可。垂直方向上图片占用多少屏幕空间并不重要,只要图像比例正确即可。 - fredley
1
类似问题,好答案:https://dev59.com/Z2445IYBdhLWcg3w1tgS - Pēteris Caune
1
“adjustViewBounds” 没有起作用吗? - Darpan
17个回答

3

这只是在ImageView的XML文件中设置adjustViewBounds="true"scaleType="fitCenter"即可。

<ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/image"

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

注意:layout_width 属性被设置为 match_parent

1
你可以使用我的StretchableImageView,根据可绘制对象的宽度和高度,保持宽高比(按宽度或高度)不变:
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;

public class StretchableImageView extends ImageView{

    public StretchableImageView(Context context) {
        super(context);
    }

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

    public StretchableImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

1

看这里,有一个更简单的解决方案:

ImageView imageView;

protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    imageView =(ImageView)findViewById(R.id.your_imageView);
    Bitmap imageBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);
    Point screenSize = new Point();
    getWindowManager().getDefaultDisplay().getSize(screenSize);
    Bitmap temp = Bitmap.createBitmap(screenSize.x, screenSize.x, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(temp);
    canvas.drawBitmap(imageBitmap,null, new Rect(0,0,screenSize.x,screenSize.x), null);
    imageView.setImageBitmap(temp);
}

1

您正在将ScaleType设置为ScaleType.FIT_XY。根据javadocs,这将拉伸图像以适应整个区域,必要时更改纵横比。这可以解释您所看到的行为。

要获得所需的行为... FIT_CENTER、FIT_START或FIT_END都很接近,但如果图像比它高,则不会开始填充宽度。您可以查看它们的实现方式,然后应该能够找出如何调整它以适合您的目的。


3
我曾经尝试过使用FIT_CENTER,但没有尝试其他的。不幸的是,无论setAdjustViewBounds设置为true还是false,它们都无效。是否有办法获取设备屏幕的像素宽度以及下载图像的宽度/高度,并手动设置大小? - fredley

1

ScaleType.CENTER_CROP将实现您想要的效果:拉伸到全宽,并相应缩放高度。如果缩放后的高度超过屏幕限制,则会裁剪图像。


0

这符合我的要求并且工作正常

<ImageView android:id="@+id/imgIssue" android:layout_width="fill_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY"/>


0
对我来说,android:scaleType="centerCrop"并没有解决我的问题。它实际上使图像扩大了很多。所以我尝试使用android:scaleType="fitXY",结果非常好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接