Interpolator — шта је то, криве интерполације у Android-у

Аутор: IT Sectr Објављено: 2026-03-02 Време читања: 8 мин
Interpolator — компонента Android Animation Framework-а која одређује математичку криву промене вредности анимације током времена. Уместо линеарног кретања (објекат се креће константном брзином) Interpolator омогућава убрзање, успорење или циклично мењање анимације, стварајући природно понашање. Android пружа 9 уграђених интерполатора: AccelerateInterpolator, DecelerateInterpolator, AccelerateDecelerateInterpolator, AnticipateInterpolator, OvershootInterpolator, BounceInterpolator, CycleInterpolator, LinearInterpolator и PathInterpolator. Према Android Developer Documentation, употреба нелинеарних Interpolator-а скраћује перципирано време анимације за 25–40% — корисник сматра одзив глаткијим и осетљивијим. У IT Sectr-у користимо AccelerateDecelerateInterpolator за појављивање елемената и OvershootInterpolator за дугмад акција.

Главно

  • Interpolator — математичка функција која претвара линеарни ток анимације (0→1) у нелинеарну криву брзине.
  • 9 уграђених интерполатора у Android-у: од Linear до Bounce — покривају 90% типичних сценарија анимације.
  • PathInterpolator (API 21+) омогућава задавање произвољне Bezier криве са две контролне тачке.
  • TimeInterpolator — интерфејс за креирање прилагођених интерполатора са методом getInterpolation().
  • AccelerateDecelerateInterpolator — симетрична крива: убрзање на почетку, успорење на крају, најунверзалнији избор.

Шта је Interpolator?

Interpolator — интерфејс у Android-у који пресликава разломљену вредност напретка анимације (од 0.0 до 1.0) у стварну вредност са промењеном брзином. Ако анимација траје 300 милисекунди, систем позива Interpolator за сваки кадар, прослеђујући тренутни напредак. Interpolator враћа модификовану вредност — на пример, за AccelerateInterpolator у 50% времена анимација прелази само ~25% пута, симулирајући убрзање.

Математички, Interpolator се може представити као функција f(t), где је t нормализовано време [0, 1], а f(t) нормализована вредност [0, 1] (или шира за Overshoot/Bounce). Линеарни интерполатор враћа f(t) = t — објект се креће константном брзином. AccelerateInterpolator апроксимира f(t) = t², DecelerateInterpolator — f(t) = 1 − (1 − t)², стварајући гладак почетак или завршетак. У Android Animation Framework-у Interpolator се примењује и на ValueAnimator и на ObjectAnimator и ViewPropertyAnimator, што даје јединствени приступ управљању брзином на свим нивоима.

Уграђени интерполатори Android-а

Android нуди 9 уграђених интерполатора, сваки са својим математичким моделом. Избор интерполатора одређује карактер анимације: физичност (Bounce), еластичност (Overshoot) или глаткоћу (AccelerateDecelerate).

Интерполатор Математика Сценарио
LinearInterpolator f(t) = t Индикатори напретка, покретна трака
AccelerateInterpolator f(t) = tⁿ (n=2) Излетање елемента из екрана, појављивање одоздо
DecelerateInterpolator f(t) = 1 − (1 − t)ⁿ Падање објекта, улазак одозго са успорењем
AccelerateDecelerateInterpolator cos-апроксимација Универзални, појављивање/нестајање елемената
AnticipateInterpolator Кубична са повлачењем уназад Еластични улазак — објекат се мало одмиче пре старта
OvershootInterpolator Кубична са прелетањем Дугме акције — мало прескаче циљну позицију
AnticipateOvershootInterpolator Комбинација Anticipate + Overshoot Картице — повлачење уназад + прелетање са повратком
BounceInterpolator Пригушени одскоци Лопта, пад елемента на површину
PathInterpolator Кубични Bezier (2 контролне тачке) Прилагођене криве за дизајн систем

Сваки интерполатор има XML декларацију у res/interpolator/ и Kotlin класу у пакету android.view.animation. AccelerateDecelerateInterpolator — најчешће коришћени: његова крива подсећа на easing функцију ease-in-out у CSS-у. За Android апликације са Material Design-ом препоручује се OvershootInterpolator за дугмад floating action button (FAB) — ствара ефекат „поскочивања" при појављивању.

PathInterpolator: прилагођене криве

PathInterpolator — интерполатор заснован на Bezier кривој, дефинисан кроз објекат Path. Доступан од API 21 (Android 5.0). Омогућава визуелно пројектовање криве брзине — дизајнер црта криву, програмер је преноси у код кроз координате контролних тачака. Подржан је само кубични Bezier (две контролне тачке C1, C2).

Крива PathInterpolator-а увек почиње у тачки (0,0) и завршава се у (1,1). Контролне тачке одређују облик: (x1, y1) — тачка на почетку, (x2, y2) — на крају. Вредности x морају бити у опсегу [0,1] — ово гарантује монотоност током времена. Вредности y могу излазити из [0,1] — ово ствара ефекат прелетања (overshoot) или повлачења (anticipate). На пример, стандардни Material Design користи криву fast-out-slow-in са контролним тачкама (0.4, 0.0, 0.2, 1.0). У IT Sectr-у градимо прилагођене PathInterpolator-е за сваки дизајн систем — ово гарантује једнообразност анимација на свим екранима.

Креирање сопственог Interpolator-а

Ако уграђени интерполатори не покривају сценарио, Android омогућава креирање сопственог кроз имплементацију интерфејса TimeInterpolator. Једина метода — getInterpolation(input: Float): Float. Input — тренутни напредак анимације од 0 до 1; output — модификована вредност. Output може излазити из [0,1] за ефекте прелетања или одскока.

Типични прилагођени интерполатори: bounce ефекат са пригушењем (излазак из 1.0 и повратак), elastic ефекат (синусоидално пригушење), step-интерполатор (дискретни скокови). Прилагођени интерполатори се могу дефинисати и кроз XML помоћу тага <interpolator> и навођења класе. У Android Studio-у постоји уграђени преглед Interpolator-а у Layout Inspector-у — приказује стварну криву за изабрани интерполатор, што поједностављује отклањање грешака.

Примери кода у Kotlin-у

Пример 1: AccelerateDecelerateInterpolator са ValueAnimator-ом

Основна анимација скале дугмета коришћењем симетричног интерполатора. ValueAnimator мења вредност од 1.0 до 1.2 и назад, а AccelerateDecelerateInterpolator чини кретање глатким.

kotlin
import android.animation.ValueAnimator
import android.view.animation.AccelerateDecelerateInterpolator
import android.view.View

fun View.pulseAnimation() {
    ValueAnimator.ofFloat(1.0f, 1.2f).apply {
        duration = 300
        interpolator = AccelerateDecelerateInterpolator()
        repeatCount = 1
        repeatMode = ValueAnimator.REVERSE

        addUpdateListener { animator ->
            val scale = animator.animatedValue as Float
            this@pulseAnimation.scaleX = scale
            this@pulseAnimation.scaleY = scale
        }

        start()
    }
}

AccelerateDecelerateInterpolator ствара глатко повећање на почетку и глатки повратак на крају. Метода REVERSE понавља анимацију у обрнутом смеру, стварајући ефекат пулсације. Овај образац се користи за дугмад акција, привлачећи пажњу корисника на кључни елемент интерфејса.

Пример 2: PathInterpolator са прилагођеном кривом

Прилагођена крива са overshoot ефектом — објекат прелеће циљну позицију за 10% и враћа се. Контролне тачке (0.4, 0.0, 0.6, 1.3) задају убрзани улаз са прелетањем.

kotlin
import android.animation.ObjectAnimator
import android.graphics.Path
import android.view.animation.PathInterpolator
import android.view.View

fun View.slideWithOvershoot() {
    val path = Path().apply {
        cubicTo(0.4f, 0.0f, 0.6f, 1.3f, 1.0f, 1.0f)
    }
    val interpolator = PathInterpolator(path)

    ObjectAnimator.ofFloat(this, "translationY", 200f, 0f).apply {
        duration = 400
        interpolator = interpolator
        start()
    }
}

PathInterpolator прима Path са кубичном Bezier кривом. У примеру, елемент „прелеће" циљну позицију (y=1.3 у 60% времена) и враћа се на финал. Path мора бити строго монотон по оси x, иначе ће анимација ићи уназад. За проверу користите Layout Inspector у Android Studio-у.

Пример 3: Прилагођени BounceInterpolator

Сопствени интерполатор са ефектом пригушених одскока. Имплементација кроз TimeInterpolator са четири циклуса пригушења.

kotlin
import android.animation.TimeInterpolator

class DampedBounceInterpolator : TimeInterpolator {

    private val cycles = 4
    private val damping = 0.85f

    override fun getInterpolation(input: Float): Float {
        val t = input * cycles
        val decay = Math.pow(damping.toDouble(), cycles.toDouble()).toFloat()
        val peak = t - (Math.floor(t.toDouble())).toFloat()
        val bounce = Math.sin(peak * Math.PI).toFloat()
        return 1f - bounce * decay * (1f - input)
    }
}

Прилагођени DampedBounceInterpolator ствара 4 пригушена одскока са коефицијентом пригушења 0.85. Метода getInterpolation прима линеарни input и враћа вредност са ефектом „опруге". У IT Sectr-у користимо овај интерполатор за анимацију појављивања обавештења — одскок ствара осећај физичности и привлачи пажњу.

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

По чему се AccelerateDecelerateInterpolator разликује од PathInterpolator-а?

AccelerateDecelerateInterpolator ствара симетричну криву — објекат убрзава на почетку и успорава на крају. PathInterpolator омогућава задавање произвољне криве кроз Path са контролном тачком (кубични Bezier). За прилагођену анимацију са асиметричним понашањем (нпр. брз старт + спори завршетак) користите PathInterpolator са контролним тачкама (0.2, 0.8, 0.4, 1.0).

Може ли се креирати сопствени Interpolator у Android-у?

Да, имплементирајте интерфејс TimeInterpolator и преопишите методу getInterpolation(input: Float): Float. Input — разломљена вредност од 0 до 1 (напредак анимације), output — стварна вредност. На пример, bounce ефекат се имплементира враћањем вредности већих од 1 или мањих од 0 за еластично понашање. Региструјте интерполатор кроз XML таг или користите директно у коду.

Да ли је PathInterpolator доступан на свим верзијама Android-а?

PathInterpolator је додат у API 21 (Android 5.0 Lollipop). За старије верзије користите AccelerateDecelerateInterpolator или прилагођени TimeInterpolator. PathInterpolator подржава само кубичне Bezier криве са две контролне тачке — праве линије и квадратне криве могу дати нетачну интерполацију. За повратну компатибилност користите AccelerateDecelerateInterpolator као fallback.

Који интерполатор препоручује Material Design?

Material Design 3 препоручује криву fast-out-slow-in са контролним тачкама (0.4, 0.0, 0.2, 1.0) за појављивање елемената, linear-out-slow-in (0.0, 0.0, 0.2, 1.0) за нестајање и fast-out-linear-in (0.4, 0.0, 1.0, 1.0) за кретање. У Android-у су ове криве имплементиране у класи FastOutSlowInInterpolator из библиотеке Material Components.

Да ли Interpolator утиче на перформансе анимације?

Минимално. Уграђени интерполатори извршавају једну математичку операцију по кадру — overhead је неприметан. Прилагођени интерполатори са тешким прорачунима (тригонометрија, петље) могу изазвати micro-jank на слабијим уређајима. Оптимизујте кроз предрачун вредности у конструктору или користите TimeInterpolator са кеширањем.

Итог

  • Interpolator — математичка функција која претвара линеарни ток анимације у нелинеарну криву брзине, чинећи покрет природним.
  • 9 уграђених интерполатора Android-а покрива 90% сценарија — од линеарног кретања до физичких одскока.
  • PathInterpolator (API 21+) задаје прилагођену Bezier криву са две контролне тачке за прецизну контролу анимације.
  • TimeInterpolator — интерфејс за креирање сопствених интерполатора са произвољном математиком.
  • Material Design препоручује fast-out-slow-in за појављивање, linear-out-slow-in за нестајање елемената.
  • AccelerateDecelerateInterpolator — универзални избор за симетричне анимације са глатким почетком и крајем.
  • Прилагођени интерполатори са пригушеним одскоцима стварају физичко понашање за обавештења и интерактивне елементе.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

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

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