在我应用的应用程序中,用户可以从图库中获取照片或直接从相机拍摄照片,将其设置为个人资料照片。
然后,这张照片显示在个人资料页面中,其位置如下:
我的测试手机是带有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空间。事实上,这做得很好。问题是图像的大小和变形。
答案 0 :(得分:1)
使用centerCrop
和adjustViewBounds
完成工作。
<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小部件的实现。