2016-11-23 6 views
11

स्केल किए गए 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(); 
    } 
} 

Full example

मैं इन दो मामलों के साथ गुणवत्ता अंतर नहीं समझ सकता। मेरे लिए ऐसा लगता है कि उन्हें अदला-बदली होना है।

उत्तर

2

स्केलिंग के दौरान खराब गुणवत्ता Android docs के अनुसार हार्डवेयर त्वरण की एक सीमा है।

1

अपना प्रश्न देखने के बाद, मैंने GLES20RecordingCanvas कक्षा का स्रोत कोड देखने का निर्णय लिया। और यहां मैंने जो पाया है:

GLES20RecordingCanvasGLES20Canvas से विस्तारित है जो HardwareCanvas से फैला हुआ है। यह HardwareCanvas वर्ग Canvas से फैली हुई है। लेकिन मैंने देखा मुख्य अंतर यह है कि यह isHardwareAcceleratedMethod() को वापस लौटता है।

तो मेरी धारणा यह है कि GLES20RecordingCanvas हार्डवेयर त्वरण के साथ बिटमैप प्रस्तुत करता है जबकि कैनवास नहीं करता है। और शायद यही कारण है कि आपको GLES20RecorgingCanvas के साथ कम गुणवत्ता मिलती है।

+0

आप 'कैनवास' और 'GLES20RecordingCanvas' –

+1

दोनों के लिए' canvas.isHardwareAccelerated() 'के मान की जांच कर सकते हैं प्रश्न दावा यह चारों ओर एक और तरीका है। यदि यह विपरीत था तो यह सही समझ में आया होगा, चूंकि ओपनजीएल आकारों का प्रतिनिधित्व करने के लिए चरम का उपयोग कर रहा है, और बिटमैप पिक्सल –

+0

@YoniGross का उपयोग कर रहा है धन्यवाद। मैंने गलत समझा। बस मेरा जवाब संपादित किया –

संबंधित मुद्दे