0

問題が発生しています。ビットマップのスケーリングされたバージョンを描画するポスト描画リスナーがあります。この問題は、ズームが発生するたびに何らかのスケーリングを行う傾向があるという事実に起因しています (ズームインのスケールアップ、ズームアウトのスケールダウン)。問題は、描画後にビットマップをリサイクルしようとすると、ビットマップをリサイクルできないことです

canvas.draw(scaledbitmap,0,0,null);
scaledBitmap.recycle()

Canvas がリサイクルされたビットマップを描画できないという例外が発生する

ビットマップを使い終わった後、別のビットマップを後でスケーリングして OutOfMemoryException クラッシュを起こさないようにする方法を知っている人はいますか。

私がそれをどのように使用しているかを正確に示すコード:

private SpenDrawListener mPosteDrawListener = new SpenDrawListener() {

        @Override
        public void onDraw(Canvas canvas, float x, float y, float ratio,
            float frameStartX, float frameStartY, RectF updateRect) {
            if(mLineDrawingBitmap == null)
                mLineDrawingBitmap = loadLineDrawingBitmap(mLineDrawingFileName);

            Bitmap bm = Bitmap.createScaledBitmap(mLineDrawingBitmap, (int)(mLineDrawingBitmap.getWidth() * ratio), (int)(mLineDrawingBitmap.getHeight() * ratio), true);
            /*
            float pointX = (mScreenRect.width() - bm.getWidth()) / 2;
            float pointY = mScreenRect.height() / 2 - bm.getHeight();
            */
            float pointX = frameStartX - (x * ratio);
            float pointY = frameStartY - (y * ratio);

            //canvas.drawBitmap(bm, 0, 0,null);
            canvas.drawBitmap(bm, pointX, pointY, null);

            //bm.recycle();
        }
    };
4

1 に答える 1

0

数時間の試行錯誤の後、適切にスケーリングし、OutOfMemoryException でアプリをクラッシュさせない方法を見つけました: 以下は、実行時にクラッシュせずに描画およびスケーリングするためのコードです (デコード時に画像が大きすぎない限り)。 . 独自の PostDrawListener を使用しますが、少し変更すればどこでも使用できると思います

private SpenDrawListener mPosteDrawListener = new SpenDrawListener() {
    @Override
    public void onDraw(Canvas canvas, float x, float y, float ratio,
        float frameStartX, float frameStartY, RectF updateRect) {
        if(mLineDrawingBitmap == null)
                mLineDrawingBitmap = loadLineDrawingBitmap(mLineDrawingFileName);

        float pointX = frameStartX - (x * ratio);
        float pointY = frameStartY - (y * ratio);

        //Create a new Matrix
        Matrix m = new Matrix();
        //Use any scaling ratio you want
        m.postScale(ratio, ratio);
        //Use any translation you want
        m.postTranslate(pointX, pointY);
        //when using below call you will not be creating a new bitmap, just
        //using the original with runtime modifications    
        canvas.drawBitmap(mLineDrawingBitmap, m, null);

    }
};
于 2013-10-09T19:14:27.403 に答える