2015-05-19 4 views
13

Я экспериментировал с Drawable здесь и нашел то, что я не могу объяснить, и надеюсь, что кто-то может мне помочь.Различное поведение для FillType.EVEN_ODD при добавлении CornerPathEffect?

Почему добавление CornerPathEffect к Paint, кажется, «перерыв» (?) EVEN_ODDFillType?

Чтобы быть более конкретным, я тестировал класс this HexagonDrawable. Это то, что я получаю:

Hard corners, outlined, expected behavior.

Однако, если установить CornerPathEffect к Paint, как показано ниже (конструктор) ...

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

... это то, что я получаю :

Rounded corners, outline effect disappears, unexpected behavior?

закругленные углы, да, но не указано внешний вид (нечетные/четные/нечетные). Может кто-нибудь объяснить, почему?

ответ

5

Этот класс HexagonDrawable рисует два разных шестиугольника, уложенных друг на друга. Я не знаю, нужно ли вам так, но я думаю, что лучший способ добиться такого же результата - использовать стиль Paint with Stroke.

Чтобы сделать это, вам нужно удалить второй путь шестиугольник и уменьшить размер шестиугольника (в таким образом, представление не будет резать):

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

И добавить эффект Stroke к краске:

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

Это должно создать очень похожий эффект на то, что вы искали.

Надеюсь, это поможет! ;)

Редактировать: Я забыл предупредить вас, что ширина обводки не может быть больше радиуса CornerPathEffect, иначе она будет обрезана в любом случае.

+0

Прагматично, ваш ответ действительно идеален и обеспечивает то, что я буду использовать в этом случае. Вы также добавляете дополнительные данные, которые я пропустил (как штрих рисуется относительно пути, ограничения ширины хода до радиуса и т. Д.). Однако я сформулировал вопрос определенным, очень определенным образом, потому что я действительно хочу понять и понять поведение EVEN_ODD и закрытых строк, поэтому я начал экспериментировать с этим классом для начала). Но, конечно, ваша помощь очень ценится! – davidcesarino

Смежные вопросы