2015-05-19 29 views
13

Stavo sperimentando con Drawable qui e ho trovato qualcosa che non posso spiegare e spero che qualcuno mi possa aiutare.Comportamento diverso per FillType.EVEN_ODD quando si aggiunge un CornerPathEffect?

Perché l'aggiunta di un CornerPathEffect al Paint sembra “rompere” (?) Il EVEN_ODDFillType?

Per essere più specifici, stavo testando la classe this HexagonDrawable così com'è. Questo è ciò che ottengo:

Hard corners, outlined, expected behavior.

Tuttavia, se ho impostato un CornerPathEffect al Paint, come mostrato di seguito (costruttore) ...

public HexagonDrawable(int color) { 
    paint.setColor(color); 
    paint.setPathEffect(new CornerPathEffect(6)); // added 
    hexagon.setFillType(Path.FillType.EVEN_ODD); 
} 

... questo è ciò che ottengo :

Rounded corners, outline effect disappears, unexpected behavior?

angoli arrotondati, sì, ma non aspetto delineato (dispari/pari/dispari). Qualcuno potrebbe spiegare perché?

risposta

5

Quella classe HexagonDrawable disegna due esagoni diversi, impilati uno sopra l'altro. Non so se è necessario che sia così, ma penso che il modo migliore per ottenere lo stesso risultato sia usare uno stile Paint with Stroke.

Per fare ciò, è necessario rimuovere il secondo percorso esagono e diminuire le dimensioni della esagonale (quindi la vista non è tagliato):

public void computeHex(Rect bounds) { 

    final int width = bounds.width(); 
    final int height = bounds.height(); 
    // We need to decrease the hexagon's size, so the view won't cut our stroke 
    final int size = Math.min(width - (strokeWidth/2), height - (strokeWidth/2)); 
    final int centerX = bounds.left + (width/2); 
    final int centerY = bounds.top + (height/2); 

    hexagon.reset(); 
    hexagon.addPath(createHexagon(size, centerX, centerY)); 
    // Remove the second path 
    // hexagon.addPath(createHexagon((int) (size * .8f), centerX, centerY)); 
} 

E aggiungere l'effetto del colpo alla vernice:

private int strokeWidth; 

public HexagonDrawable(int color, int strokeWidth) {   
    this.strokeWidth = strokeWidth; 

    paint.setColor(color); 

    // Add Stroke style and width 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeWidth(strokeWidth); 

    // You can add these other attributes if you need to 
    // paint.setDither(true); 
    // paint.setStrokeJoin(Paint.Join.ROUND); 
    // paint.setStrokeCap(Paint.Cap.ROUND); 

    // Remove the fill type, you won't need anymore 
    // hexagon.setFillType(Path.FillType.EVEN_ODD); 

    // Finally add the Path Effect 
    paint.setPathEffect(new CornerPathEffect(30.0f)); 
} 

Questo dovrebbe creare un effetto molto simile a quello che stavi cercando.

Spero che aiuti! ;)

Modifica: ho dimenticato di avvertire che la larghezza del tratto non può essere maggiore del raggio di CornerPathEffect, altrimenti verrà comunque tagliata.

+0

Pragmaticamente, la tua risposta è davvero perfetta e raggiunge esattamente quello che userei in questo caso. Inoltre, aggiungo ulteriori dettagli che mi sono sfuggiti (come viene tracciato il tratto rispetto al percorso, i vincoli della larghezza del tratto al raggio ecc.). Tuttavia, ho formulato la domanda in un certo modo molto specifico perché voglio davvero imparare e capire il comportamento di EVEN_ODD e delle linee chiuse, ed è per questo che stavo sperimentando con quella classe per cominciare). Ma, naturalmente, il tuo aiuto è molto apprezzato! – davidcesarino