6

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

位图在我们不再使用后需要回收。我在 View 类中看不到 onDestroy() 或任何类似的东西。有没有我可以重写的回调方法来实现这一点?

public void <insert_callback_here>() {
    cachedBitmap.recycle();
}

没有动画。这是一张静态图片。绘制图像需要进行大量计算,所以我宁愿在 onMeasure() 上执行一次。

4

1 回答 1

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);
}
于 2012-08-02T23:49:22.547 回答