4

我在我的应用程序中设置了以下矩形图像。

在此处输入图像描述

现在我正在尝试在两侧以相同的比例扩展图像,直到它适合屏幕。但我无法获得预期的图像。

在此处输入图像描述

到目前为止,我的代码是:

<ImageView
    android:id="@+id/imgid"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:src="@drawable/shayneward"
    android:scaleType="fitXY"/>

它不在乎图像被截断,但它应该以相同的比例在两侧展开,直到它适合屏幕。

4

3 回答 3

9

更改android:scaleType="fitXY"android:scaleType="centerCrop"获得您想要的行为。

ImageView.ScaleType下记录了不同的缩放选项。

于 2012-06-19T05:39:28.840 回答
5

尝试使用这个:

android:scaleType="centerCrop"

在 Android 文档中,中心裁剪执行以下操作:

均匀缩放图像(保持图像的纵横比),使图像的两个尺寸(宽度和高度)都等于或大于视图的相应尺寸(减去填充)。

请参阅ImageView.ScaleType 此处的文档。

于 2012-06-19T05:43:23.080 回答
1

如果图像太小可能会出现问题,因为它没有缩放以适应屏幕尺寸。

我使用这个类来解决这个问题:

public class FixedCenterCrop extends ImageView {


    public FixedCenterCrop(Context context) {
        super(context);
        setScaleType(ScaleType.MATRIX);
    }

    public FixedCenterCrop(Context context, AttributeSet attrs) {
        super(context, attrs);
        setScaleType(ScaleType.MATRIX);
    }

    public FixedCenterCrop(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setScaleType(ScaleType.MATRIX);
    }


    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        recomputeImgMatrix();
    }

    @Override
    protected boolean setFrame(int l, int t, int r, int b) {
        recomputeImgMatrix();
        return super.setFrame(l, t, r, b);
    }

    private void recomputeImgMatrix() {
        final Matrix matrix = getImageMatrix();

        float scale;
        final int viewWidth = getWidth() - getPaddingLeft() - getPaddingRight();
        final int viewHeight = getHeight() - getPaddingTop() - getPaddingBottom();
        final int drawableWidth = getDrawable().getIntrinsicWidth();
        final int drawableHeight = getDrawable().getIntrinsicHeight();

        if (drawableWidth * viewHeight > drawableHeight * viewWidth) {
            scale = (float) viewHeight / (float) drawableHeight;
        } else {
            scale = (float) viewWidth / (float) drawableWidth;
        }

        matrix.setScale(scale, scale);
        matrix.postTranslate((viewWidth - drawableWidth * scale) / 2, (viewHeight - drawableHeight*scale)/2);
        setImageMatrix(matrix);
    }
}
于 2015-08-28T10:41:08.707 回答