Справочник 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.
Path result = Path.makeCombining(pathA, pathB, PathOp.INTERSECT);Доступные операции PathOp:
DIFFERENCE: A - BINTERSECT: A & BUNION: A | BXOR: (A | B) - (A & B)REVERSE_DIFFERENCE: B - A
Преобразования и модификация
Эти методы возвращают новый экземпляр Path с применённым преобразованием.
makeTransform(matrix): ПрименяетMatrix33ко всем точкам пути.makeOffset(dx, dy): Сдвигает путь.makeScale(s): Масштабирует путь.
Интерполяция (Морфинг)
Вы можете интерполировать между двумя совместимыми путями (полезно для анимаций).
// Интерполяция на 50% между pathA и pathB
if (pathA.isInterpolatable(pathB)) {
Path midPath = pathA.makeInterpolate(pathB, 0.5f);
}Сериализация
serializeToBytes(): Сериализует путь в массив байтов.makeFromBytes(bytes): Восстанавливает путь из байтов.dump(): Выводит структуру пути в стандартный вывод (для отладки).
Измерение и итерация
PathMeasure: Используется для вычисления длины пути и нахождения позиций/касательных вдоль него.PathSegmentIterator: Позволяет перебирать отдельные команды (verbs) и точки, из которых состоит путь.
Пример
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.