Point outSize = new Point(showBigIvPic.getWidth(),showBigIvPic.getHeight());// 显示区域的高宽
// 使用图片的缩放比例计算将要放大的图片的高度
int bitmapScaledHeight = Math.round(resourceBitmap.getHeight() * outSize.x * 1.0f / resourceBitmap.getWidth());
// 以屏幕的宽度为基准,如果图片的宽度比屏幕宽,则等比缩小,如果窄,则放大
final Bitmap scaledBitmap = Bitmap.createScaledBitmap(resourceBitmap, outSize.x, bitmapScaledHeight, false);
showIvPic.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
try {
showIvPic.getViewTreeObserver().removeOnPreDrawListener(this);
//这里防止图像的重复创建,避免申请不必要的内存空间
if (scaledBitmap.isRecycled())return true;//必须返回true
int viewHeight = showBigIvPic.getMeasuredHeight();
Bitmap finallyBitmap = null;
if(scaledBitmap.getHeight() > viewHeight){
int offset = (scaledBitmap.getHeight() - viewHeight) / 2;// 计算将要裁剪的图片的顶部以及底部的偏移量
finallyBitmap = Bitmap.createBitmap(scaledBitmap, 0, offset, scaledBitmap.getWidth(),scaledBitmap.getHeight() - offset * 2);// 对图片以中心进行裁剪,裁剪出的图片就是非常适合了
}else{
int offset = (viewHeight - scaledBitmap.getHeight()) / 2;// 计算将要显示图片的顶部偏移量
//finallyBitmap = Bitmap.createBitmap(scaledBitmap, 0, offset, scaledBitmap.getWidth(),scaledBitmap.getHeight());
finallyBitmap = Bitmap.createBitmap(scaledBitmap.getWidth(), viewHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(finallyBitmap);
canvas.drawBitmap(scaledBitmap, 0, offset, null);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
}
if(null != finallyBitmap){
if(!finallyBitmap.equals(scaledBitmap)){//如果返回的不是原图,则对原图进行回收
scaledBitmap.recycle();
System.gc();
}//end of if
//showBigIvPic.setImageBitmap(resourceBitmap);
}else{
ToastUtils.showToastNew("抱歉,显示选择图片失败...");
}
}catch (Exception e){
ToastUtils.showToastNew("抱歉,显示选择图片异常...");
}
if (resourceBitmap != null && !resourceBitmap.isRecycled()) resourceBitmap.recycle();
return true;
}
});