2015-10-28 10 views
8

मेरे ऐप में मुझे बिटमैप और drawCircle() विधि का उपयोग करके मंडलियों को आकर्षित करने की आवश्यकता है।एंड्रॉइड 6.0 गलत तरीके से ड्रॉ करता है DrawCircle विधि

सब कुछ ठीक काम कर रहा था और ठीक उसी तरह यह एंड्रॉइड 6.0 तक होना चाहिए।

यह अभी भी पिछले सभी संस्करणों पर मंडल खींचता है, लेकिन जब मैं 6.0 पर ऐप का उपयोग करता हूं तो आयताकार खींचता है। लेकिन यदि मैं इसे भरने के लिए बदलता हूं, तो यह एपीआई 22 और एपीआई 23 दोनों में एक सर्कल खींचता है। किसी को भी एक ही समस्या है या कोई विचार यह क्यों होता है?

यहां स्रोत कोड और एक स्क्रीनशॉट (बाईं ओर एपीआई 23 पर चल रहा ऐप, और दाईं ओर एपीआई 22) है। same app on different api's

public final class Circle1View extends View { 

    private float xCenter, yCenter; 
    private Bitmap grid = null; 

    public Circle1View (Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     int w = getWidth(); 
     int h = getHeight(); 
     xCenter = w/2; 
     yCenter = h/2; 

     drawBitmaps(w, h); 

     canvas.translate(xCenter, yCenter); 
     canvas.scale(xCenter, yCenter); 

     canvas.drawBitmap(grid, null, new RectF(-1, -1, 1, 1), null); 
    } 


    private void drawBitmaps(int w, int h) { 

     grid = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(); 

     canvas.translate(xCenter, yCenter); 
     canvas.scale(xCenter, yCenter); 

     Paint gridPaint = new Paint(); 

     gridPaint.setStrokeWidth(0.01f); 
     // Works with FILL 
     // gridPaint.setStyle(Paint.Style.FILL); 
     gridPaint.setStyle(Paint.Style.STROKE); 

     canvas.setBitmap(grid); 

     canvas.drawCircle(0, 0, 0.5f, gridPaint); 


    } 
} 
+0

मैं मंडलियों को चित्रित करने के तरीके को फिर से प्रतिक्रिया देने का प्रयास करूंगा। क्या आप वर्णन कर सकते हैं कि क्या खींचा जाना है? उदाहरण के लिए: त्रिज्या के साथ केंद्रित एक सर्कल आधे चौड़ाई के बराबर है। –

उत्तर

1

मुझे लगता है कि स्केलिंग और अनुवाद तुम क्या साथ क्या करने के लिए कुछ नहीं है। कल्पना की गई सर्कल की कल्पना इतनी छोटी है, इसमें केवल 4 पिक्सेल लगते हैं। इसे पूर्ण आकार में वापस लेते समय, आपको इन पिक्सेल के बीच 4 सीधी रेखाओं के साथ छोड़ दिया जाता है।

जब मैं स्ट्रोक चौड़ाई को 0.04f में बदलता हूं, तो समस्या समाप्त हो जाती है। मैं तुम्हें आपूर्ति Canvas सीधे पर बनाकर अपने कोड को आसान बनाने का सुझाव देते हैं:

@Override 
protected void onDraw(Canvas canvas) { 
    int w = getWidth(); 
    int h = getHeight(); 
    xCenter = w/2; 
    yCenter = h/2; 

    Paint gridPaint = new Paint(); 

    gridPaint.setStrokeWidth(1f); 
    gridPaint.setStyle(Paint.Style.STROKE); 

    canvas.drawCircle(xCenter, yCenter, w/4, gridPaint); 
} 

API स्तरों के बीच अंतर के बारे में अपने प्रश्न के लिए के रूप में: Marshmallow drawBitmap() के लिए परिवर्तन की शुरुआत की। आप Lollipop और Marshmallow के लिए संबंधित स्रोत कोड पर एक नज़र डाल सकते हैं।

+0

यह मेरा पहला विचार था। लेकिन यह एपीआई पर काम कर रहा है <23. हम उसे कैसे समझा सकते हैं? –

+1

मैंने एंड्रॉइड स्रोत कोड पर एक नज़र डाली थी। 'DrawBitmap' के लिए कोड में कुछ बड़े बदलाव हैं। मैंने विवरणों को नहीं देखा, लेकिन अगर ऐसा कारण है तो मुझे आश्चर्य नहीं होगा। मैं अपने उत्तर में लिंक जोड़ दूंगा। – Thomas

+0

अच्छा। मैं मानता हूं कि कैनवास को सीधे ड्राइंग करना सबसे अच्छा विकल्प होगा। –

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