Skip to content

Справочник API: Path

Класс Path представляет сложные составные геометрические пути, состоящие из отрезков прямых, квадратичных и кубических кривых.

Примечание: Для построения новых путей настоятельно рекомендуется использовать PathBuilder вместо прямого вызова методов у Path. PathBuilder предоставляет более удобный fluent API и гарантирует, что результирующий Path будет неизменяемым.

Построение пути (Статические фабрики)

Хотя PathBuilder предпочтительнее для сложных путей, Path предлагает эффективные статические фабрики для распространённых фигур.

  • makeRect(rect): Создаёт путь из прямоугольника.
  • makeOval(rect): Создаёт путь из овала.
  • makeCircle(x, y, radius): Создаёт путь из окружности.
  • makeRRect(rrect): Создаёт путь из прямоугольника со скруглёнными углами.
  • makeLine(p1, p2): Создаёт путь из одного отрезка прямой.
  • makePolygon(points, closed): Создаёт путь из последовательности точек.
  • makeFromSVGString(svgString): Разбирает строку SVG-пути (например, "M10 10 L50 50 Z").

Информация о пути и метрики

  • getBounds(): Возвращает консервативную ограничивающую рамку (быстро, кэшируется).
  • computeTightBounds(): Возвращает точную ограничивающую рамку (медленнее).
  • isEmpty(): Возвращает true, если путь не содержит команд (verbs).
  • isConvex(): Возвращает true, если путь определяет выпуклую фигуру.
  • isRect(): Возвращает Rect, если путь представляет собой простой прямоугольник, иначе null.
  • isOval(): Возвращает ограничивающий Rect, если путь является овалом, иначе null.
  • isFinite(): Возвращает true, если все точки пути конечны.

Проверка попадания (Hit Testing)

  • contains(x, y): Возвращает true, если указанная точка находится внутри пути (на основе текущего типа заполнения).
  • conservativelyContainsRect(rect): Возвращает true, если прямоугольник определённо находится внутри пути (быстрый тест отсечения).

Булевы операции

Пути можно комбинировать с помощью логических операций. Эти операции создают новый объект Path.

java
Path result = Path.makeCombining(pathA, pathB, PathOp.INTERSECT);

Доступные операции PathOp:

  • DIFFERENCE: A - B
  • INTERSECT: A & B
  • UNION: A | B
  • XOR: (A | B) - (A & B)
  • REVERSE_DIFFERENCE: B - A

Преобразования и модификация

Эти методы возвращают новый экземпляр Path с применённым преобразованием.

  • makeTransform(matrix): Применяет Matrix33 ко всем точкам пути.
  • makeOffset(dx, dy): Сдвигает путь.
  • makeScale(s): Масштабирует путь.

Интерполяция (Морфинг)

Вы можете интерполировать между двумя совместимыми путями (полезно для анимаций).

java
// Интерполяция на 50% между pathA и pathB
if (pathA.isInterpolatable(pathB)) {
    Path midPath = pathA.makeInterpolate(pathB, 0.5f);
}

Сериализация

  • serializeToBytes(): Сериализует путь в массив байтов.
  • makeFromBytes(bytes): Восстанавливает путь из байтов.
  • dump(): Выводит структуру пути в стандартный вывод (для отладки).

Измерение и итерация

  • PathMeasure: Используется для вычисления длины пути и нахождения позиций/касательных вдоль него.
  • PathSegmentIterator: Позволяет перебирать отдельные команды (verbs) и точки, из которых состоит путь.

Пример

java
Path path = new Path()
    .moveTo(10, 10)
    .lineTo(100, 10)
    .lineTo(100, 100)
    .quadTo(50, 150, 10, 100)
    .closePath();

canvas.drawPath(path, paint);

Тип заполнения (Fill Type)

Тип заполнения определяет, какие области считаются "внутренними" для операций заливки.

  • WINDING (По умолчанию): Использует правило номера обхода (winding number).
  • EVEN_ODD: Использует правило чётности (even-odd).
  • INVERSE_WINDING: Инвертирует правило обхода (заполняет снаружи).
  • INVERSE_EVEN_ODD: Инвертирует правило чётности.

Визуальный пример

Примеры создания, модификации и комбинирования путей смотрите в examples/scenes/src/PathsScene.java.