Как нарисовать заполненный полигон на холсте

#java #android #canvas #path

#java #Android #холст #путь

Вопрос:

Мне нужно залить цветом область заданного полигона на пользовательском представлении. Я не могу найти метод, с помощью которого я могу использовать для этого вопроса.

На самом деле я могу рисовать только линии, соединяющие эти точки, но я не уверен, как заполнить область, окруженную ими.

Следующий код, который я использую для рисования линий:

 
for (Path p : paths) {
                Paint color = p.getColor();
                float strokeW = color.getStrokeWidth();
                color.setStrokeWidth(pthStrokeWdth);

                List<Point> currentPath = p.getCoordinateList();
                for (int i = 1; i < currentPath.size(); i  ) {
                    float startX = currentPath.get(i - 1).x;
                    float startY = currentPath.get(i - 1).y;
                    float endX = currentPath.get(i).x;
                    float endY = currentPath.get(i).y;
                    canvas.drawLine((startX * cellWidth)   xOffset   halfCellWidth, (startY * cellHeight)   yOffset   halfCellHeight,
                            (endX * cellWidth)   xOffset   halfCellWidth, (endY * cellHeight)   yOffset   halfCellHeight, color);

                }
                color.setStrokeWidth(originalStrokeWidth);
 }
  

Выше показаны линии между каждой точкой, образующие полигоны различной формы. Смотрите скриншот ниже.

введите описание изображения здесь

Итак, я хотел бы заполнить область внутри полигона, как показано ниже:

введите описание изображения здесь

Спасибо за ваше время.

Ответ №1:

Вам нужно установить Paint.Стиль в FILL или FILL_AND_STROKE

paint.setStyle(Paint.Style.FILL);

Редактировать:

     Paint color = p.getColor();
    float strokeW = color.getStrokeWidth();
    color.setStrokeWidth(pthStrokeWdth);
    color.setStyle(Paint.Style.FILL);

    List<Point> currentPath = p.getCoordinateList();
    //for each path we want to draw a line which consist of 4 points
    float[] points = new float[currentPath.size() * 4];
    int count = 0;
    for (int i = 1; i < currentPath.size(); i  ) {
        float startX = currentPath.get(i - 1).x;
        float startY = currentPath.get(i - 1).y;
        float endX = currentPath.get(i).x;
        float endY = currentPath.get(i).y;
        points[count  ] = (startX * cellWidth)   xOffset   halfCellWidth;
        points[count  ] = (startY * cellHeight)   yOffset   halfCellHeight;
        points[count  ] = (endX * cellWidth)   xOffset   halfCellWidth;
        points[count  ] = (endY * cellHeight)   yOffset   halfCellHeight, color;
    }
    canvas.drawLines(points, color);
  

Комментарии:

1. @Krul Вероятно, нет, я полагаю, по умолчанию он игнорирует стиль, но вы, вероятно, можете использовать drawLines вместо этого

2. Я уже рисую линии, теперь мне нужно заполнить область, окруженную линиями.

3. @Krul Да, я знаю, я говорю, что вместо использования drawLine вы можете использовать drawLines или возможное использование drawRect(RectF rect, Paint paint)

4. Хммм… ну, но формы не всегда прямоугольные.

5. @Krul Я знаю, именно поэтому я говорил использовать DrawLines, проверьте основной пост