我想我已经阅读了有关位图和内存问题的所有答案,但找不到我的问题的解决方案:

我正在使用Bitmap.createBitmap创建四个纯色背景位图并在其上绘制一些文本(请参阅下面的代码) . 问题是在一些内存不足的设备上,我得到一个OutOfMemoryException,因为位图在堆上占用超过30MB . 我认为这只是纯色和一些文字 . 我不再需要时正确地回收位图,但我需要在内存中有4个 .

我的问题:有没有办法减少这些位图的内存消耗?
我尝试在createBitmap中减小宽度和高度,但随后文本大小不再正确 . 我也尝试在创建之后压缩这样的图像:

ByteArrayOutputStream out = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 0, out);
Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray()));

但这并没有减少堆大小 .


Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.eraseColor(mColor);
Canvas canvas = new Canvas(bitmap);
TextPaint paint = new TextPaint();
canvas.drawBitmap(bitmap, 0, 0, paint);
paint.setAntiAlias(true);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
paint.setTextAlign(Paint.Align.CENTER);
paint.setTypeface(FontManager.getTypefaceGeogrotesqueMedium());

float fontSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 55, getResources().getDisplayMetrics());
float fontSizeReason = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics());

paint.setTextSize(fontSize);

int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
int distance = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics());

float xPos = canvas.getWidth() / 2;
float yPos = (canvas.getHeight() - distance) / 2;
canvas.drawText((String) TextUtils.ellipsize(mText, paint, canvas.getWidth() - margin, TextUtils.TruncateAt.END), xPos, yPos, paint);

yPos -= paint.ascent() + paint.descent();
yPos += distance;
paint.setTypeface(FontManager.getTypefaceGeogrotesqueRegular());
canvas.drawText((String) TextUtils.ellipsize(mOtherText, paint, canvas.getWidth() - margin, TextUtils.TruncateAt.END), xPos, yPos, paint);