在处理java.lang.OutOfMemoryError时遇到问题:位图大小超出了VM预算错误。原始图片从不大于250x250px。并从drawable文件夹加载。我在互联网上找到了一些解决'inJustDecodeBounds'的解决方案,但我无法让它工作..有关如何解决这个问题的任何想法?这让我头疼了两天......
现在我正在通过我根据父宽度计算的因子来重新缩放图像..
@Override
public View getView(int position, View v, ViewGroup parent) {
View mView = v;
this.parent = parent;
if (mView == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
mView = vi.inflate(R.layout.caa_xml, null);
}
ImageView image = (ImageView) mView.findViewById(R.id.iv_caarow);
String name = getItem(position).getFile();
int resId = C.getResources().getIdentifier(name, "drawable",
"com.test.com");
int imageWidth = (int) calculateImageWidth();
// load the origial BitMap (250 x 250 px)
Bitmap bitmapOrg = BitmapFactory
.decodeResource(C.getResources(), resId);
int width = bitmapOrg.getWidth();
int height = bitmapOrg.getHeight();
int newWidth = imageWidth;
int newHeight = imageWidth;
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// create a matrix for the manipulation
Matrix matrix = new Matrix();
// resize
matrix.postScale(scaleWidth, scaleHeight);
// recreate the new Bitmap
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width,
height, matrix, true);
BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);
image.setImageDrawable(bmd);
if (mView != null) {
//additional code here
}
return mView;
}
private float calculateImageWidth() {
// TODO Auto-generated method stub
int parentW = parent.getWidth() - parent.getPaddingLeft()
- parent.getPaddingRight();
Resources r = C.getResources();
float pxPaddingBetweenItem = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 2, r.getDisplayMetrics());
float pxPaddingInItem = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
int totalImageWidth = (parentW - (int) (3 * pxPaddingBetweenItem) - (int) (8 * pxPaddingInItem)) / 4;
float imageWidth = (float) totalImageWidth;
return imageWidth;
}
答案 0 :(得分:3)
问题是,您使用旧的大位图创建缩放的位图。之后,你的内存中有两个位图,你甚至不回收旧的位图。
无论如何,还有更好的方法:
ImageView imageView = (ImageView) findViewById(R.id.some_id);
String pathToImage = "path";
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(pathToImage, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = Math.min(photoW/50, photoH/50);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(pathToFile, bmOptions);
imageView.setImageBitmap(bitmap);
修改强>
如果要使用资源ID而不是文件路径,请使用decodeResource并执行最后一部分,如下所示:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId, bmOptions);
imageView.setImageBitmap(bitmap);
希望这段代码可以帮助你!