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 која представља секвенцу сегмената путање: правих линија, квадратних и кубних Безијерових кривих, лукова кругова и елипси. За разлику од растерских слика, Path чува само математички опис контуре, што омогућава скалирање без губитка квалитета. Величина Path објекта у меморији је пропорционална броју сегмената, а не резолуцији екрана.

Path ради у тесној вези са Canvas и Paint. Canvas.drawPath(path, paint) прима готову контуру и приказује је према стиловима Paint-а. Ово раздвајање омогућава да се једном изгради сложена контура и вишеструко црта са различитим стиловима — бојом, дебљином линије или градијентом. Према Google I/O 2023, поновно коришћење Path-а смањује време цртања прилагођених View-ова за 25–40%.

Сваки Path се састоји од секвенце тачака и типова сегмената. Тачке се задају у координатном систему Canvas-а, где је X оса усмерена удесно, а Y оса — надоле. Почетна тачка контуре се поставља методом moveTo, након чега се сваки наредни сегмент додаје у односу на претходну тачку. Све операције изградње се извршавају на CPU-у и не захтевају GPU до тренутка цртања.

Изградња линија: moveTo и lineTo

Метода moveTo помера оловку до наведене тачке без цртања линије. Она поставља почетну позицију за следећи сегмент. Без moveTo, почетна тачка Path-а је подразумевано на (0, 0). За сваку нову непрекидну контуру потребан је засебан moveTo — ово је стандардни приступ за цртање више независних линија у једном Path-у.

lineTo — права линија

lineTo додаје прави сегмент од тренутне позиције оловке до задате тачке. Након позива lineTo, тренутна позиција се помера на крајњу тачку сегмента. Секвенца lineTo позива креће изломљену линију — полилинију. За затварање контуре користи се метода close, која повлачи праву линију од последње тачке до почетне тачке последњег moveTo-а.

rLineTo и rMoveTo — релативне верзије метода. Оне прихватају помераје dx и dy од тренутне позиције, а не апсолутне координате. rLineTo је погодан за изградњу облика са понављајућим корацима, на пример решетки и мрежа. Релативне методе не захтевају прерачунавање апсолутних координата при померању целе контуре.

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, које прихватају помераје од тренутне позиције. Ово је посебно корисно при програмском генерисању кривих на основу релативних прираштаја, на пример при цртању таласа или синусоида. Прецизност Безијерових кривих зависи само од прецизности прорачуна на CPU-у — при цртању се растеризују са субпикселском резолуцијом.

МетодаТип кривеКонтролних тачакаПримена
quadToКвадратна Безијерова1Заобљења, једноставни лукови
cubicToКубна Безијерова2Фонтови, сложене контуре
rQuadToРелативна квадратна1Таласи, синусоиде
rCubicToРелативна кубна2Органски облици

Готови облици: кругови, правоугаоници и лукови

addCircle додаје круг у Path као нову контуру. Параметри: координате центра, полупречник и смер обиласка (CW — у смеру казаљке на сату, CCW — супротно). Након позива, тренутна позиција оловке се не мења — круг се додаје као самостална затворена контура, неповезана са претходним сегментима. Ово омогућава комбиновање готових облика са произвољним линијама у једном Path-у.

addRect и addOval

addRect додаје правоугаоник задат координатама горњег левог и доњег десног угла. addOval додаје елипсу уписану у наведени правоугаоник. Обе методе подржавају параметар Direction. За заобљене углове користи се addRoundRect, који прихвата полупречнике заобљења за све углове или низ од 8 вредности полупречника (по две по углу).

arcTo додаје лук круга или елипсе. Параметри: ограничавајући правоугаоник, почетни угао у степенима, угао разворота и застава forceMoveTo. Ако је forceMoveTo true, пре лука се извршава moveTo до почетне тачке лука, у супротном се лук повезује са тренутном позицијом правом линијом. Лукови се активно користе у кружним дијаграмима и индикаторима напретка.

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. Подржане су операције DIFFERENCE, INTERSECT, UNION, XOR и REVERSE_DIFFERENCE. Резултат је нови Path који садржи геометрију добијену након примене изабране операције. Ово омогућава креирање сложених облика од једноставних основних фигура без ручног израчунавања тачака пресека.

Примена Path Op-а у дизајну

UNION спаја две контуре у једну. INTERSECT оставља само област која припада обема контурама. DIFFERENCE одузима другу контуру од прве — погодно за изрезивање „рупа” у облицима. XOR оставља области које припадају само једној од контура. REVERSE_DIFFERENCE одузима прву контуру од друге.

Метода op прима два Path-а и операцију, враћајући true ако резултат није празан. Рачунска сложеност операције зависи од броја сегмената у обе контуре. За једноставне облике (мање од 100 сегмената) операција се извршава за субмилисекунде. Path Op се активно примењује у едиторима слика, дизајнерским алатима и при изградњи сложених UI елемената.

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-а. Фигура се гради од два лука и две праве линије, које формирају симетрични силует. Код демонстрира комбинацију moveTo, cubicTo и close за добијање глатке контуре.

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 омогућавају прецизну контролу облика сваке половине срца. Прва крива формира десни горњи лук, друга — леви, трећа и четврта — доњи део. Метода close затвара контуру у доњој тачки. Овакав приступ се примењује за креирање прилагођених икона, логотипа и декоративних елемената у апликацијама.

За тестирање облика може се привремено укључити цртање са Paint.Style.STROKE — ово ће показати све помоћне линије и криве. Ако контура изгледа неравномерно, повећајте број тачака у кривама или користите PathMeasure за процену дужине и равномерности сегмената. PathMeasure пружа тачне метрике путање, неопходне за анимацију кретања дуж контуре.

Често постављана питања

Која је разлика између addPath и op?

addPath једноставно додаје једну контуру другој без промене геометрије. op изводи Булову операцију (спајање, пресек, одузимање) и мења геометрију. За једноставно спајање користите addPath, за сложене облике — op.

Како проверити да ли Path садржи тачку?

Метода computeBounds враћа ограничавајући правоугаоник. За тачну проверу користите Region: креирајте Region из Path-а и позовите contains(x, y). За сложене контуре Region може бити тежак — примените PathOp за претходно поједностављење.

Може ли се Path анимирати?

Да, путем ValueAnimator-а са ажурирањем тачака Path-а у сваком кадру. За глатку анимацију облика користите библиотеку AnimatedVectorDrawable — она подржава анимацију између два стања Path-а са интерполацијом Безијерових кривих.

Која је максимална величина Path-а?

Не постоји строго ограничење, али Path чува све тачке у меморији. За контуре са више од 10 000 сегмената перформансе цртања опадају. За сложену графику поделите контуру на неколико Path-ова и користите Hardware Accelerator путем View.isHardwareAccelerated.

Чиме се Path разликује од Shape-а у Android-у?

Path — програмска класа за изградњу произвољних контура у коду. Shape (GradientDrawable) — XML ресурс за једноставне облике са ограниченим могућностима. 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. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође