我正在处理自定义视图,这给我带来了意想不到的结果。我试图发生的事情是填充图片的宽度和视图的比例,并保持其纵横比,但它做了一些奇怪的事情...将图像缩放为自定义视图的宽度
这是我生成的日志正在吐出。
- 的大小:768x942
- PIC是肖像
- 原稿尺寸:960x1280缩放:768x768
- 缩放位图:768x768
现在让我解释什么日志根据代码说。首先我们让视图onMeasure
本身,一旦完成,我们可以抓住视图的宽度和高度。接下来,我们检查图片是横向还是纵向。然后,我们只是做数学来找到我们需要缩放的大小。数学完成后,我们用结果创建一个新的缩放位图。宽度是正确的,但高度应该是1024不是768.我看不到它在哪里搞乱了。
public void setBitmap(Bitmap bmp) {
this.mOriginalBitmap = bmp;
if(mHasMeasured) {
//Make sure the view has measured itself so we can grab the width and height
Log.d("", "View size: " + String.valueOf(this.mViewWidth)
+ "x" + String.valueOf(this.mViewHeight));
int reqWidth, reqHeight; //The required sizes we need
//Get the new sizes for the pic to fit in the view and keep aspect ratio
if(this.mOriginalBitmap.getWidth() > this.mOriginalBitmap.getHeight()) {
//Landscape :/
Log.d("", "Pic is Landscape");
reqHeight = this.mViewHeight;
reqWidth = (this.mOriginalBitmap.getWidth()
/this.mOriginalBitmap.getHeight()) * reqHeight;
} else {
//Portrait :)
Log.d("", "Pic is portrait");
reqWidth = this.mViewWidth;
reqHeight = (this.mOriginalBitmap.getHeight()
/this.mOriginalBitmap.getWidth()) * reqWidth;
}
Log.d("", "Original Size: "
+ String.valueOf(mOriginalBitmap.getWidth()) + "x"
+ String.valueOf(mOriginalBitmap.getHeight())
+ " Scaled: " + String.valueOf(reqWidth)
+ "x" + String.valueOf(reqHeight));
this.mBmpScaledForView = Bitmap.createScaledBitmap(mOriginalBitmap,
reqWidth, reqHeight, false);
this.mSrc.top = 0;
this.mSrc.left = 0;
this.mSrc.right = this.mBmpScaledForView.getWidth();
this.mSrc.bottom = this.mBmpScaledForView.getHeight();
this.mDst = this.mSrc;
Log.d("", "Scaled bitmap : "
+ String.valueOf(this.mBmpScaledForView.getWidth())
+ "x" + String.valueOf(this.mBmpScaledForView.getHeight()));
}
}
问题与整数除法。 'Bitmap.getHeight'返回一个int,所以'getHeight/getWidth'为1,这会导致'reqWidth == reqHeight' – njzk2 2014-09-25 15:06:48
啊!好的,那么用float吧? – bwoogie 2014-09-25 15:07:36
或简单地反转你的操作:'reqHeight =(reqWidth * this.mOriginalBitmap.getHeight())/ this.mOriginalBitmap.getWidth();' – njzk2 2014-09-25 15:08:41