2015-10-28 4 views
8

Nella mia app ho bisogno di disegnare cerchi usando bitmap e il metodo drawCircle().Android 6.0 gestisce in modo errato il metodo drawCircle

Tutto stava funzionando bene e esattamente come dovrebbe fino a Android 6.0.

Disegna ancora cerchi su tutte le versioni precedenti, ma disegna rettangoli quando uso l'app su 6.0. Ma se lo cambio da riempire, disegna un cerchio sia in api 22 che api 23. Qualcuno ha lo stesso problema o qualche idea del perché questo accada?

Ecco il codice sorgente e uno screenshot (app in esecuzione su API 23 a sinistra e API 22 a destra). 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

Vorrei provare a rifattorizzare il modo in cui stai disegnando i cerchi. Potresti descrivere cosa deve essere disegnato? Ad esempio: un cerchio centrato con raggio equivale a metà larghezza. –

risposta

1

Penso che abbia qualcosa a che fare con la scala e la traduzione che fate. Immagina che il cerchio disegnato sia così piccolo che richiede solo 4 pixel. Quando si ingrandisce di nuovo le dimensioni, si rimane con 4 linee rette tra questi pixel.

Quando si modifica la larghezza del tratto su 0.04f, il problema è scomparso. Vorrei suggerire di semplificare il codice attingendo alla dotazione Canvas direttamente:

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

Per quanto riguarda la tua domanda circa la differenza tra i livelli di API: Zefiro ha introdotto modifiche per drawBitmap(). Puoi dare un'occhiata al rispettivo codice sorgente per Lollipop e Marshmallow.

+0

Questo è stato il mio primo pensiero. Ma sta lavorando su API <23. Come potremmo spiegarlo? –

+1

Ho dato un'occhiata al codice sorgente di Android. Ci sono alcune importanti modifiche al codice per 'drawBitmap'. Non ho esaminato i dettagli, ma non sarei sorpreso se questa fosse la ragione. Aggiungerò i collegamenti alla mia risposta. – Thomas

+0

Bello. Sono d'accordo che disegnare direttamente sulla tela sarebbe l'opzione migliore. –