在ImageView上设置时图像变形

时间:2015-06-04 11:01:52

标签: android

在我应用的应用程序中,用户可以从图库中获取照片或直接从相机拍摄照片,将其设置为个人资料照片。

然后,这张照片显示在个人资料页面中,其位置如下:

enter image description here

我的测试手机是带有KitKat 4.4.4的HTC Sensation。这里的图片显示确定,但在我的个人设备中,Galaxy S5 5.0,图片显示效果不佳。它适合整个空间,但看起来变形。如果图像是横向的,它会变窄,如果是纵向的,它会变宽。

这是我用于此提案的代码,在这种情况下,从相机拍摄照片:

/*Get's data from onActivityResult*/
Bitmap srcBmp = (Bitmap) data.getExtras().get("data");

Bitmap landBmp = null;
/*If it is square or portrait*/
if (srcBmp.getWidth() <= srcBmp.getHeight()) {
    landBmp = Bitmap.createBitmap(
        srcBmp,
        0,
        srcBmp.getHeight()/4,
        srcBmp.getWidth(),
        srcBmp.getHeight() /2
    );
/*If is on landscape*/
} else {
    landBmp = srcBmp.copy(srcBmp.getConfig(), true);
}

/*Get screen dimensions*/
Display display = getActivity().getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int screenWidth = size.x;
int screenHeight = size.y;

/*Bitmap scaling*/
int picOriginalWidth = srcBmp.getWidth();
int picOriginalHeight = srcBmp.getHeight();
Bitmap fullbitmap = Bitmap.createScaledBitmap(landBmp, screenWidth, (originalHeight*screenWidth)/originalWidth, true);

//After this I save the pic on memory, this works fine so isn't relevant
...

那么,也许某些操作需要进行修正才能完美匹配,或者有更好的方法可以做到这一点?

编辑 -

上述文字中修改了一些内容。问题不在于Image不适合ImageView空间。事实上,这做得很好。问题是图像的大小和变形。

2 个答案:

答案 0 :(得分:1)

使用centerCropadjustViewBounds完成工作。

<ImageView
        android:layout_width="fill_parent"
        android:layout_height="260dp"
        android:id="@+id/picview"
        android:src="@drawable/header_default_full"
        android:scaleType="centerCrop"
        android:adjustViewBounds="true"
        android:layout_alignParentTop="true" />

答案 1 :(得分:0)

试试这个:

public final class FitWidthImageView extends ImageView {

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

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

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            try {
                    Drawable drawable = getDrawable();
                    if (drawable == null) {
                            setMeasuredDimension(0, 0);
                    } else {
                            int width = MeasureSpec.getSize(widthMeasureSpec);
                            int height = width * drawable.getIntrinsicHeight() / drawable.getIntrinsicWidth();
                            setMeasuredDimension(width, height);
                    }
            } catch (Exception e) {
                    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
    }
}

它只是适合屏幕宽度的ImageView小部件的实现。