12

拡大縮小して描画されたパスGLES20RecordingCanvasは、ビットマップで拡大縮小されずに描画されてから拡大されたかのような品質を持ちます。

対照的に、Canvasバッキング ビットマップを使用して作成し、同じスケーリング変換をCanvasオブジェクトに適用すると、はるかに優れたビットマップが得られます。

ここでは、両方の円がPath.addCircleと を使用して描かれていCanvas.scaleます。上の円は拡大縮小で描画されGLES20RecordingCanvas、下の円は拡大縮小された単純なCanvas背景ビットマップで描画されます。

いくつかのコード:

public class TestPathRenderer extends View {

    ...

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        int measuredWidth = getMeasuredWidth();
        int measuredHeight = getMeasuredHeight();
        float distortedWidth = getDistortedWidth();
        float distortedHeight = getDistortedHeight();

        path.reset();
        path.addCircle(distortedWidth/2f, distortedHeight/2f, Math.min(distortedWidth/2f, distortedHeight/2f), Path.Direction.CW);

        bitmap = assembleNewBitmap(measuredWidth, measuredHeight);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        switch (renderMode) {
            case RENDER_MODE_WO_BITMAP:
                drawOnCanvas(canvas);
                break;
            case RENDER_MODE_WITH_BITMAP:
                canvas.drawBitmap(bitmap, 0f, 0f, paint);
                break;
            default:
                throw new UnsupportedOperationException("Undefined render mode: " + renderMode);
        }
    }

    private Bitmap assembleNewBitmap(int w, int h) {
        Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        drawOnCanvas(canvas);
        return bitmap;
    }

    private void drawOnCanvas(@NonNull Canvas canvas) {
        canvas.save();
        canvas.scale(DISTORTION_FACTOR, DISTORTION_FACTOR);
        canvas.drawPath(path, paint);
        canvas.restore();
    }
}

完全な例

この 2 つの場合の品質の違いは理解できません。私にとっては、それらは交換可能でなければならないようです。

4

2 に答える 2