2015-10-28 3 views
8
falsch

In meiner App muss ich Kreise mit der Bitmap und der drawCircle() -Methode zeichnen.Android 6.0 behandelt die drawCircle-Methode

Alles funktionierte gut und genau so wie es bis Android 6.0 sein sollte.

Es zeichnet immer noch Kreise auf allen vorherigen Versionen, aber zeichnet Rechtecke, wenn ich die App auf 6.0 verwende. Aber wenn ich es zum Füllen ändern, zeichnet es einen Kreis sowohl in api 22 als auch api 23. Hat jemand das gleiche Problem oder eine Idee, warum das passiert?

Hier ist der Quellcode und ein Screenshot (App läuft auf API 23 auf der linken Seite und API 22 auf der rechten Seite). 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

Ich würde versuchen, die Art, wie Sie die Kreise zeichnen, neu zu gestalten. Kannst du beschreiben, was gezeichnet werden muss? Zum Beispiel: ein Kreis mit zentriertem Radius entspricht der halben Breite. –

Antwort

1

Ich denke, es hat etwas mit der Skalierung und Übersetzung, die Sie tun, um zu tun. Stellen Sie sich vor, der Kreis, der gezeichnet wird, ist so klein, dass er nur 4 Pixel benötigt. Wenn Sie diese Größe wieder auf die volle Größe vergrößern, bleiben 4 gerade Linien zwischen diesen Pixeln.

Wenn ich die Strichbreite auf 0.04f ändere, ist das Problem weg. Ich würde vorschlagen, dass Sie Ihren Code vereinfachen, indem sie direkt auf die mitgelieferten Canvas Zeichnung:

@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); 
} 

Was Ihre Frage nach dem Unterschied zwischen API-Ebenen: Eibisch für drawBitmap() Änderungen eingeführt. Sie können sich den jeweiligen Quellcode für Lollipop und Marshmallow ansehen.

+0

Das war mein erster Gedanke. Aber es arbeitet an api <23. Wie können wir das erklären? –

+1

Ich habe mir den Android-Quellcode angeschaut. Es gibt einige wichtige Änderungen am Code für 'drawBitmap'. Ich habe nicht ins Detail geschaut, aber ich wäre nicht überrascht, wenn das der Grund ist. Ich werde die Links zu meiner Antwort hinzufügen. – Thomas

+0

Schön. Ich stimme zu, dass das direkte Zeichnen auf die Leinwand die beste Option wäre. –

Verwandte Themen