Подтвердить что ты не робот

Различное поведение для FillType.EVEN_ODD при добавлении CornerPathEffect?

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

Почему добавление CornerPathEffect в Paint кажется "сломано" (?) EVEN_ODD FillType?

Чтобы быть более конкретным, я тестировал этот 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?

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

4b9b3361

Ответ 1

Этот класс 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 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, иначе она все равно будет обрезана.