2015-05-19 13 views
13

Ich experimentierte mit Drawable hier und fand etwas, was ich nicht erklären kann und hoffe, dass mir jemand helfen kann.Unterschiedliches Verhalten für FillType.EVEN_ODD beim Hinzufügen eines CornerPathEffect?

Warum das Hinzufügen einer CornerPathEffect zum Paint zu „brechen“ scheint (?) Die EVEN_ODDFillType?

Um genauer zu sein, habe ich this HexagonDrawable Klasse getestet, wie es ist. Dies ist, was ich bekommen:

Hard corners, outlined, expected behavior.

Wenn ich jedoch eine CornerPathEffect zum Paint gesetzt, wie unten (Konstruktor) gezeigt ...

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

... das ist, was ich :

Rounded corners, outline effect disappears, unexpected behavior?

abgerundete Ecken, Ja, aber kein umrissenen Aussehen (ungerade/gerade/ungerade). Könnte jemand bitte erklären warum?

Antwort

5

Diese HexagonDrawable-Klasse zeichnet zwei verschiedene Sechsecke, die übereinander gestapelt sind. Ich weiß nicht, ob Sie es brauchen, aber ich denke, der beste Weg, um das gleiche Ergebnis zu erzielen, ist die Verwendung eines Paint-with-Stroke-Stils.

so zu tun, müssen Sie den zweiten Sechseck Pfad entfernen und die Sechseck Größe verringern (so die Ansicht wird nicht schneiden):

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

Und den Schlaganfall-Effekt auf die Farbe hinzufügen:

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

Das sollte einen sehr ähnlichen Effekt zu dem, was Sie suchen, erstellen.

Hoffe es hilft! ;)

Edit: Ich habe vergessen dich zu warnen, dass die Stroke Breite nicht größer sein kann als CornerPathEffects Radius, sonst wird es trotzdem abgeschnitten.

+0

Pragmatisch ist Ihre Antwort in der Tat perfekt und erreicht genau das, was ich in diesem Fall verwenden würde. Sie fügen auch zusätzliche Details hinzu, die ich übersehen habe (wie der Strich relativ zum Pfad gezeichnet wird, Einschränkungen der Strichbreite zum Radius usw.). Allerdings habe ich die Frage auf eine bestimmte, sehr spezifische Weise formuliert, weil ich wirklich das Verhalten von EVEN_ODD und geschlossenen Zeilen lernen und verstehen möchte, weshalb ich zu Beginn mit dieser Klasse experimentierte. Aber natürlich wird Ihre Hilfe sehr geschätzt! – davidcesarino