在Android View上正确释放位图的位置?

gar*_*tor 6 android view bitmap android-custom-view

我有一个自定义视图,它绘制了一些包括位图的东西.我想将这个绘图缓存到一个位图上,这样我只需要在onDraw中绘制一个单独的位图,而不是重复这些绘图任务和计算.

在我们不再使用位图后,需要回收位图.我没有在View类中看到onDestroy()或任何远程类似的东西.有没有我可以覆盖的回调方法来实现这个目的?

public void <insert_callback_here>() {
    cachedBitmap.recycle();
}
Run Code Online (Sandbox Code Playgroud)

没有动画.这是一张静态图片.有很多计算来绘制图像,所以我宁愿在onMeasure()上做一次.

gar*_*tor 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);
}
Run Code Online (Sandbox Code Playgroud)