स्केल किए गए 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();
}
}
मैं इन दो मामलों के साथ गुणवत्ता अंतर नहीं समझ सकता। मेरे लिए ऐसा लगता है कि उन्हें अदला-बदली होना है।
आप 'कैनवास' और 'GLES20RecordingCanvas' –
दोनों के लिए' canvas.isHardwareAccelerated() 'के मान की जांच कर सकते हैं प्रश्न दावा यह चारों ओर एक और तरीका है। यदि यह विपरीत था तो यह सही समझ में आया होगा, चूंकि ओपनजीएल आकारों का प्रतिनिधित्व करने के लिए चरम का उपयोग कर रहा है, और बिटमैप पिक्सल –
@YoniGross का उपयोग कर रहा है धन्यवाद। मैंने गलत समझा। बस मेरा जवाब संपादित किया –