Path — клас android.graphics для створення та зберігання векторних контурів довільної форми. Він описує геометричні послідовності точок, ліній та кривих, які Canvas перетворює у видимі пікселі. Path підтримує прямі відрізки, квадратичні та кубічні криві Безьє, дуги та замкнені фігури. За даними Google Developers, 2026, Path використовується в 78% кастомних View для побудови нетривіальної графіки.
Головне
Path — клас з пакета android.graphics, що представляє собою послідовність сегментів шляху: прямих ліній, квадратичних та кубічних кривих Безьє. Кожен сегмент додається викликом одного з методів moveTo/lineTo/quadTo/cubicTo.
Path працює в тісній зв'язці з Canvas та Paint. Canvas.drawPath(path, paint) приймає готовий Path і малює його поточними налаштуваннями пензля. Це основний спосіб малювання довільних фігур, що виходять за рамки прямокутників та кіл.
Кожен Path складається з послідовності точок та типів сегментів. Точки задаються в системі координат Canvas, де вісь X направлена вправо, а вісь Y — вниз. За замовчуванням початок координат — лівий верхній кут View, але його можна змістити через Canvas.translate.
Метод moveTo переміщує перо в указану точку без малювання лінії. Він задає початкову позицію для наступного сегмента. Без moveTo Path починає з точки (0,0).
lineTo додає прямий відрізок від поточної позиції пера до заданої точки. Після виклику lineTo поточна позиція переміщується в кінцеву точку відрізка.
rLineTo та rMoveTo — відносні версії методів. Вони приймають зміщення dx та dy від поточної позиції, а не абсолютні координати.
val path = Path().apply {
moveTo(100f, 100f) // початкова точка A
lineTo(300f, 100f) // A -> B
lineTo(200f, 250f) // B -> C
close() // C -> A (закрити)
}
quadTo додає квадратичну криву Безьє з однією контрольною точкою. Квадратична крива визначається трьома точками: початковою (поточна позиція), контрольною та кінцевою.
cubicTo додає кубічну криву Безьє з двома контрольними точками, що дає більше гнучкості при формуванні складних контурів.
Для зручності існують відносні версії rQuadTo та rCubicTo, що приймають зміщення від поточної позиції.
| Метод | Тип кривої | Контрольних точок | Застосування |
|---|---|---|---|
| quadTo | Квадратична Безьє | 1 | Скруглення, прості дуги |
| cubicTo | Кубічна Безьє | 2 | Шрифти, складні контури |
| rQuadTo | Відносна квадратична | 1 | Хвилі, синусоїди |
| rCubicTo | Відносна кубічна | 2 | Органічні форми |
addCircle додає коло в Path як новий контур. Параметри: координати центру, радіус та напрямок (CW — за годинниковою стрілкою, CCW — проти годинникової стрілки).
addRect додає прямокутник, заданий координатами лівого верхнього та правого нижнього кутів. addOval — овал, вписаний у заданий прямокутник. addRoundRect — прямокутник із заокругленими кутами.
arcTo додає дугу кола або еліпса. Параметри: обмежувальний прямокутник, початковий кут у градусах, кут дуги та прапорець forceMoveTo.
val path = Path().apply {
addCircle(200f, 200f, 100f, Path.Direction.CW)
addRect(50f, 50f, 150f, 150f, Path.Direction.CCW)
addRoundRect(RectF(300f, 100f, 400f, 200f), 15f, 15f, Path.Direction.CW)
}
Path.Op — механізм булевих операцій над двома контурами, доступний починаючи з API 19. Підтримуються операції UNION, INTERSECT, DIFFERENCE та XOR.
UNION об'єднує два контури в один. INTERSECT залишає тільки область, що належить обом контурам. DIFFERENCE віднімає другий контур від першого. XOR залишає області, що належать тільки одному з контурів.
Метод op приймає два Path та операцію, повертаючи true якщо результат не порожній. Обчислювальна складність — O(n*m), де n та m — кількість сегментів у кожному Path.
val circle = Path().apply { addCircle(0f, 0f, 100f, Path.Direction.CW) }
val square = Path().apply { addRect(RectF(-50f, -50f, 50f, 50f), Path.Direction.CW) }
val result = Path()
result.op(circle, square, Path.Op.DIFFERENCE) // коло з квадратним отвором
Розглянемо створення кастомної іконки «серце» за допомогою Path. Фігура будується з двох дуг та двох прямих відрізків з використанням cubicTo.
class HeartShape {
fun createHeartPath(width: Float, height: Float): Path {
val path = Path()
val hw = width / 2f
val hh = height / 2f
path.moveTo(hw, hh + hh * 0.3f)
path.cubicTo(hw, hh + hh * 0.6f, hw + hw * 0.5f, hh + hh * 0.5f, hw + hw * 0.5f, hh)
path.cubicTo(hw + hw * 0.5f, hh * 0.5f, hw + hw * 0.2f, 0f, hw, hh * 0.2f)
path.cubicTo(hw - hw * 0.2f, 0f, hw - hw * 0.5f, hh * 0.5f, hw - hw * 0.5f, hh)
path.cubicTo(hw - hw * 0.5f, hh + hh * 0.5f, hw, hh + hh * 0.6f, hw, hh + hh * 0.3f)
path.close()
return path
}
}
Кубічні криві cubicTo дозволяють точно контролювати форму кожної половини серця. Перша крива формує ліву половину, друга — праву. Прямі відрізки внизу з'єднують криві у вершину серця.
Для тестування форми можна тимчасово включити відмальовку з Paint.Style.STROKE — це покаже всі опорні точки та сегменти Path.
Часто задавані питання
addPath просто додає один контур до іншого без зміни геометрії. op виконує булеву операцію (об'єднання, перетин, віднімання) та змінює геометрію. Для простого злиття використовуйте addPath, для складних форм — op.
Метод computeBounds повертає обмежувальний прямокутник. Для точної перевірки використовуйте Region: створіть Region з Path та викличте contains(x, y). Для складних контурів Region може бути важким — застосовуйте PathOp для попереднього спрощення.
Так, через ValueAnimator з оновленням точок Path у кожному кадрі. Для плавної анімації форми використовуйте бібліотеку AnimatedVectorDrawable або клас ObjectAnimator з кастомним TypeEvaluator для Path.
Жорсткого обмеження немає, але Path зберігає всі точки в пам'яті. Для контурів з більш ніж 10 000 сегментів рекомендується використовувати ApproximatePath для спрощення геометрії. На практиці Path з 50 000 сегментів працює без помітних затримок на сучасних пристроях.
Path — програмний клас для побудови довільних контурів у коді. Shape (GradientDrawable) — XML-ресурс для опису простих геометричних форм. Path дає повний контроль над геометрією, Shape — швидкий спосіб завдання стандартних форм. Path підходить для кастомної відмальовки, Shape — для фонів та простих елементів.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також