縮尺で描かれたパスGLES20RecordingCanvas
は、あたかもビットマップでスケーリングされていないかのように描画され、次に拡大縮小されたような品質を持ちます。スケーリングされた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例と品質の違いを理解することはできません。私にとっては、彼らは交換可能でなければならないようです。
'canvas.isHardwareAccelerated()'の値を 'Canvas'と' GLES20RecordingCanvas'の両方でチェックすることができます –
質問はそれとは逆です。それが逆であれば、OpenGLは頂点を使ってシェイプを表現し、ビットマップはピクセルを使用しているので、完璧な意味があります。 –
@YoniGrossありがとう。私は誤解しました。私の答えを編集しました –