我有一个自定义视图,它绘制了一些包括位图的东西。我想将这个绘图缓存到一个位图上,这样我只需要在onDraw中绘制一个单独的位图,而不是重复这些绘图任务和计算。
位图需要在我们不再使用后回收。我没有在View类中看到onDestroy()或任何远程类似的东西。有没有我可以覆盖的回调方法来实现这个目标?
public void <insert_callback_here>() {
cachedBitmap.recycle();
}
没有动画。这是一张静态图片。有大量的计算来绘制图像,所以我宁愿在onMeasure()上做一次。
答案 0 :(得分:8)
我要在这里回答我自己的问题。要覆盖的正确方法是onDetachedFromWindow
。我在onDetachedFromWindow
内部取消分配我的位图,如果宽度或高度发生变化,则在onMeasure
内重新分配它们。
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (cachedBitmap != null && !cachedBitmap.isRecycled()) {
cachedBitmap.recycle();
cachedBitmap = null;
cachedBitmapWidth = -1;
cachedBitmapHeight = -1;
}
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int viewWidth = MeasureSpec.getSize(widthMeasureSpec);;
int viewHeight = MeasureSpec.getSize(heightMeasureSpec);;
if (cachedBitmapWidth != viewWidth || cachedBitmapHeight != viewHeight) {
if (cachedBitmap != null) {
cachedBitmap.recycle();
}
cachedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
cachedBitmapWidth = viewWidth;
cachedBitmapHeight = viewHeight;
Canvas canvas = new Canvas(cachedBitmap);
// do drawings here..
}
setMeasuredDimension(viewWidth, viewHeight);
}