6

ビットマップを含む多くのものを描画するカスタムビューがあります。この描画をビットマップにキャッシュしたいので、これらの描画タスクと計算を繰り返すのではなく、onDraw 内で 1 つのビットマップを描画するだけで済みます。

ビットマップは、使用しなくなった後、リサイクルする必要があります。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 に答える