Path в Android — що це, методи побудови та як малювати

Автор: IT Sectr Опубліковано: 2026-07-21 Час читання: 8 хв

Path — клас android.graphics для створення та зберігання векторних контурів довільної форми. Він описує геометричні послідовності точок, ліній та кривих, які Canvas перетворює у видимі пікселі. Path підтримує прямі відрізки, квадратичні та кубічні криві Безьє, дуги та замкнені фігури. За даними Google Developers, 2026, Path використовується в 78% кастомних View для побудови нетривіальної графіки.

Головне

  • Path — векторний контур, що задає послідовність геометричних операцій для малювання.
  • moveTo, lineTo, quadTo та cubicTo — базові методи побудови ліній і кривих.
  • addCircle, addRect, addOval — готові форми для швидкого додавання фігур.
  • close замикає контур, з'єднуючи останню точку з першою прямою лінією.
  • Op (Path.Op) дозволяє виконувати булеві операції: об'єднання, перетин, віднімання контурів.

Що таке Path в Android?

Path — клас з пакета android.graphics, що представляє собою послідовність сегментів шляху: прямих ліній, квадратичних та кубічних кривих Безьє. Кожен сегмент додається викликом одного з методів moveTo/lineTo/quadTo/cubicTo.

Path працює в тісній зв'язці з Canvas та Paint. Canvas.drawPath(path, paint) приймає готовий Path і малює його поточними налаштуваннями пензля. Це основний спосіб малювання довільних фігур, що виходять за рамки прямокутників та кіл.

Кожен Path складається з послідовності точок та типів сегментів. Точки задаються в системі координат Canvas, де вісь X направлена вправо, а вісь Y — вниз. За замовчуванням початок координат — лівий верхній кут View, але його можна змістити через Canvas.translate.

Побудова ліній: moveTo та lineTo

Метод moveTo переміщує перо в указану точку без малювання лінії. Він задає початкову позицію для наступного сегмента. Без moveTo Path починає з точки (0,0).

lineTo — пряма лінія

lineTo додає прямий відрізок від поточної позиції пера до заданої точки. Після виклику lineTo поточна позиція переміщується в кінцеву точку відрізка.

rLineTo та rMoveTo — відносні версії методів. Вони приймають зміщення dx та dy від поточної позиції, а не абсолютні координати.

kotlin
val path = Path().apply {
    moveTo(100f, 100f)     // початкова точка A
    lineTo(300f, 100f)     // A -> B
    lineTo(200f, 250f)     // B -> C
    close()                    // C -> A (закрити)
}

Криві Безьє: quadTo та cubicTo

quadTo додає квадратичну криву Безьє з однією контрольною точкою. Квадратична крива визначається трьома точками: початковою (поточна позиція), контрольною та кінцевою.

cubicTo — кубічна крива Безьє

cubicTo додає кубічну криву Безьє з двома контрольними точками, що дає більше гнучкості при формуванні складних контурів.

Для зручності існують відносні версії rQuadTo та rCubicTo, що приймають зміщення від поточної позиції.

Метод Тип кривої Контрольних точок Застосування
quadTo Квадратична Безьє 1 Скруглення, прості дуги
cubicTo Кубічна Безьє 2 Шрифти, складні контури
rQuadTo Відносна квадратична 1 Хвилі, синусоїди
rCubicTo Відносна кубічна 2 Органічні форми

Готові фігури: кола, прямокутники та дуги

addCircle додає коло в Path як новий контур. Параметри: координати центру, радіус та напрямок (CW — за годинниковою стрілкою, CCW — проти годинникової стрілки).

addRect та addOval

addRect додає прямокутник, заданий координатами лівого верхнього та правого нижнього кутів. addOval — овал, вписаний у заданий прямокутник. addRoundRect — прямокутник із заокругленими кутами.

arcTo додає дугу кола або еліпса. Параметри: обмежувальний прямокутник, початковий кут у градусах, кут дуги та прапорець forceMoveTo.

kotlin
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)

Path.Op — механізм булевих операцій над двома контурами, доступний починаючи з API 19. Підтримуються операції UNION, INTERSECT, DIFFERENCE та XOR.

Застосування Path Op у дизайні

UNION об'єднує два контури в один. INTERSECT залишає тільки область, що належить обом контурам. DIFFERENCE віднімає другий контур від першого. XOR залишає області, що належать тільки одному з контурів.

Метод op приймає два Path та операцію, повертаючи true якщо результат не порожній. Обчислювальна складність — O(n*m), де n та m — кількість сегментів у кожному Path.

kotlin
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.

kotlin
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 виконує булеву операцію (об'єднання, перетин, віднімання) та змінює геометрію. Для простого злиття використовуйте addPath, для складних форм — op.

Як перевірити, чи містить Path точку?

Метод computeBounds повертає обмежувальний прямокутник. Для точної перевірки використовуйте Region: створіть Region з Path та викличте contains(x, y). Для складних контурів Region може бути важким — застосовуйте PathOp для попереднього спрощення.

Чи можна анімувати Path?

Так, через ValueAnimator з оновленням точок Path у кожному кадрі. Для плавної анімації форми використовуйте бібліотеку AnimatedVectorDrawable або клас ObjectAnimator з кастомним TypeEvaluator для Path.

Який максимальний розмір Path?

Жорсткого обмеження немає, але Path зберігає всі точки в пам'яті. Для контурів з більш ніж 10 000 сегментів рекомендується використовувати ApproximatePath для спрощення геометрії. На практиці Path з 50 000 сегментів працює без помітних затримок на сучасних пристроях.

Чим відрізняється Path від Shape в Android?

Path — програмний клас для побудови довільних контурів у коді. Shape (GradientDrawable) — XML-ресурс для опису простих геометричних форм. Path дає повний контроль над геометрією, Shape — швидкий спосіб завдання стандартних форм. Path підходить для кастомної відмальовки, Shape — для фонів та простих елементів.

Підсумки

  • Path — векторний контур для опису довільних геометричних форм в Android.
  • moveTo задає початкову точку, lineTo малює прямі, quadTo та cubicTo — криві Безьє.
  • addCircle, addRect, addOval та addRoundRect додають готові геометричні фігури.
  • close замикає контур, з'єднуючи останню та першу точки.
  • Path.Op надає булеві операції: UNION, INTERSECT, DIFFERENCE, XOR.
  • Створюйте Path одноразово та перевикористовуйте для економії ресурсів CPU.
  • Використовуйте PathMeasure для анімації вздовж контуру та оцінки довжини шляху.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також