【发布时间】:2015-06-10 07:40:04
【问题描述】:
我在解码位图时使用options.inPurgeable将位图存储在Ashmem中。所以我不想在onDraw() 方法中绘制圆形位图时在Java heap 上创建更多位图(导致大量GC)。我的代码在下面,但它不起作用
private void init() {
mRoundPaint = new Paint();
mRoundPaint.setColor(Color.RED);
mRoundPaint.setStyle(Paint.Style.FILL);
mRoundPaint.setAntiAlias(true);
// mRoundPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
mBmPaint = new Paint();
mBmPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = Math.min(w, h);
rectDes = new Rect(0, 0, mWidth, mWidth);
}
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
if(getDrawable() == null)
return;
// Option 1
Drawable drawable = getDrawable();
canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2, mRoundPaint);
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
canvas.drawBitmap(bitmap, null, rectDes, mBmPaint);
// Option 2
// Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
// canvas.drawBitmap(bitmap, null, rectDes, mBmPaint);
// canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2, mRoundPaint);
}
结果如下:
我的期望
我也使用了 BitmapShader,它很有效。但我不知道为什么 BitmapShader 将我的位图保留在 Ashmem 中,GC 不会删除。
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(shader);
paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(mWidth / 2, mWidth/ 2, mWidth /2, paint);
感谢您的所有帮助。
编辑抱歉,我忘了显示我想要的位图。
【问题讨论】:
-
你期待什么?位图上的圆圈?
-
抱歉,我编辑了我的问题。感谢您的宝贵时间
标签: android bitmap android-bitmap