0

我需要拍摄一张图像,对其进行缩放、遮罩、添加背景以防其中一些是透明的,然后添加叠加图像。为此,我编写了以下内容:

Canvas canvas = new Canvas();
Bitmap mainImage = Bitmap.createScaledBitmap(((BitmapDrawable)d).getBitmap(), iconSize, iconSize, false);
Bitmap result = Bitmap.createBitmap(iconSize, iconSize, Bitmap.Config.ARGB_8888);

canvas.setBitmap(result);
Paint paint = new Paint();
paint.setFilterBitmap(false);

Bitmap mask = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(context.res, context.mask_bg)
                    , iconSize, iconSize, false);
                        canvas.drawBitmap(mask, 0, 0, paint);
canvas.drawBitmap(mainImage, 0, 0, paint);

mask = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(context.res, context.mask)
                    , iconSize, iconSize, false);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(mask, 0, 0, paint);

mask = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(context.res, context.mask_frame)
                    , iconSize, iconSize, false);
paint.setXfermode(null);
canvas.drawBitmap(mask, 0, 0, paint);

现在这个操作将在我的应用程序中发生很多。而且我的应用程序总是有一个正在运行的服务(在这种情况下是上下文)。我对图像的性能了解不多,而且我知道它们在空间中使用的实际尺寸最多是其实际大小的 4 倍,但这对我来说似乎是一种浪费,一遍又一遍地重新创建相同的对象。另外,我的应用程序的主要需求是性能超过大小。

所以我想知道每次在服务中生成位图是否更好,这样它们只创建一次(每次只有 mainImage 位图会改变),或者甚至作为可绘制的位图创建位图?

4

1 回答 1

1

切勿将可绘制对象保存在显示它的活动/片段之外。
它可以很容易地造成内存泄漏:drawable 保留对其活动的引用,因此垃圾收集器无法销毁它,即使它已被销毁并重新创建。
请改用位图。

于 2013-05-06T11:35:48.140 回答