Interpolator — ce este, curbele de interpolare în Android

Autor: IT Sectr Publicat: 2026-03-02 Timp de citire: 8 min
Interpolator — componentă Android Animation Framework care definește curba matematică de modificare a valorii animației în timp. În locul mișcării liniare (obiectul se mișcă cu viteză constantă) Interpolator permite accelerarea, încetinirea sau modificarea ciclică a animației, creând un comportament natural. Android oferă 9 interpolatoare încorporate: AccelerateInterpolator, DecelerateInterpolator, AccelerateDecelerateInterpolator, AnticipateInterpolator, OvershootInterpolator, BounceInterpolator, CycleInterpolator, LinearInterpolator și PathInterpolator. Conform Android Developer Documentation, utilizarea Interpolatoarelor neliniare reduce timpul perceput al animației cu 25–40% — utilizatorul consideră răspunsul mai fluent și mai receptiv. În IT Sectr folosim AccelerateDecelerateInterpolator pentru apariția elementelor și OvershootInterpolator pentru butoanele de acțiune.

Principalele concluzii

  • Interpolator — funcție matematică care transformă progresul liniar al animației (0→1) într-o curbă neliniară a vitezei.
  • 9 interpolatoare încorporate în Android: de la Linear la Bounce — acoperă 90% din scenariile tipice de animație.
  • PathInterpolator (API 21+) permite definirea unei curbe Bezier arbitrare cu două puncte de control.
  • TimeInterpolator — interfață pentru crearea de interpolatoare personalizate cu metoda getInterpolation().
  • AccelerateDecelerateInterpolator — curbă simetrică: accelerare la început, încetinire la sfârșit, cea mai universală alegere.

Ce este Interpolator?

Interpolator — interfață în Android care mapează valoarea fracționară a progresului animației (de la 0.0 la 1.0) la valoarea reală cu viteză modificată. Dacă animația durează 300 de milisecunde, sistemul apelează Interpolator pentru fiecare cadru, transmițând progresul curent. Interpolator returnează o valoare modificată — de exemplu, pentru AccelerateInterpolator la 50% din timp, animația parcurge doar ~25% din drum, simulând accelerarea.

Matematic, Interpolator poate fi reprezentat ca funcția f(t), unde t este timpul normalizat [0, 1], iar f(t) este valoarea normalizată [0, 1] (sau mai largă pentru Overshoot/Bounce). Interpolatorul liniar returnează f(t) = t — obiectul se mișcă cu viteză constantă. AccelerateInterpolator aproximează f(t) = t², DecelerateInterpolator — f(t) = 1 − (1 − t)², creând un început sau sfârșit fluent. În Android Animation Framework, Interpolator se aplică atât ValueAnimator, cât și ObjectAnimator și ViewPropertyAnimator, oferind o abordare unitară a gestionării vitezei la toate nivelurile.

Interpolatoare Android încorporate

Android oferă 9 interpolatoare încorporate, fiecare cu propriul model matematic. Alegerea interpolatorului determină caracterul animației: fizicitate (Bounce), elasticitate (Overshoot) sau fluență (AccelerateDecelerate).

Interpolator Matematică Scenariu
LinearInterpolator f(t) = t Indicatori de progres, bandă rulantă
AccelerateInterpolator f(t) = tⁿ (n=2) Ieșirea elementului din ecran, apariția de jos
DecelerateInterpolator f(t) = 1 − (1 − t)ⁿ Căderea obiectului, intrarea de sus cu încetinire
AccelerateDecelerateInterpolator Aproximare cos Universal, apariția/dispariția elementelor
AnticipateInterpolator Cubică cu retragere înapoi Intrare elastică — obiectul se retrage ușor înainte de start
OvershootInterpolator Cubică cu depășire Buton de acțiune — depășește ușor poziția țintă
AnticipateOvershootInterpolator Combinație Anticipate + Overshoot Carduri — retragere + depășire cu revenire
BounceInterpolator Salturi amortizate Minge, căderea elementului pe o suprafață
PathInterpolator Bezier cubic (2 puncte de control) Curbe personalizate pentru sistemul de design

Fiecare interpolator are o declarație XML în res/interpolator/ și o clasă Kotlin în pachetul android.view.animation. AccelerateDecelerateInterpolator — cel mai frecvent utilizat: curba sa amintește funcția ease-in-out din CSS. Pentru aplicațiile Android cu Material Design, se recomandă OvershootInterpolator pentru butoanele floating action button (FAB) — creează un efect de „săritură" la apariție.

PathInterpolator: curbe personalizate

PathInterpolator — interpolator bazat pe curba Bezier, definit prin obiectul Path. Disponibil de la API 21 (Android 5.0). Permite proiectarea vizuală a curbei vitezei — designerul desenează curba, dezvoltatorul o transferă în cod prin coordonatele punctelor de control. Este acceptat doar Bezier cubic (două puncte de control C1, C2).

Curba PathInterpolator începe întotdeauna în punctul (0,0) și se termină în (1,1). Punctele de control determină forma: (x1, y1) — punct la început, (x2, y2) — la sfârșit. Valorile x trebuie să fie în intervalul [0,1] — aceasta garantează monotonitatea în timp. Valorile y pot ieși din [0,1] — aceasta creează efectul de depășire (overshoot) sau retragere (anticipate). De exemplu, Material Design standard utilizează curba fast-out-slow-in cu punctele de control (0.4, 0.0, 0.2, 1.0). În IT Sectr construim PathInterpolator personalizate pentru fiecare sistem de design — garantează uniformitatea animațiilor pe toate ecranele.

Crearea propriului Interpolator

Dacă interpolatoarele încorporate nu acoperă scenariul, Android permite crearea unuia propriu prin implementarea interfeței TimeInterpolator. Singura metodă — getInterpolation(input: Float): Float. Input — progresul curent al animației de la 0 la 1; output — valoarea modificată. Output poate ieși din [0,1] pentru efecte de depășire sau săritură.

Interpolatoare personalizate tipice: efect bounce cu amortizare (ieșire din 1.0 și revenire), efect elastic (amortizare sinusoidală), step-interpolator (salturi discrete). Interpolatoarele personalizate pot fi definite și prin XML cu tagul <interpolator> și specificarea clasei. În Android Studio există o previzualizare incorporată Interpolator în Layout Inspector — arată curba reală pentru interpolatorul selectat, simplificând depanarea.

Exemple de cod în Kotlin

Exemplul 1: AccelerateDecelerateInterpolator cu ValueAnimator

Animația de bază a scării unui buton utilizând interpolatorul simetric. ValueAnimator modifică valoarea de la 1.0 la 1.2 și înapoi, iar AccelerateDecelerateInterpolator face mișcarea fluentă.

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 creează o creștere lină la început și o revenire lină la sfârșit. Metoda REVERSE repetă animația în direcție inversă, creând un efect de pulsație. Acest model este utilizat pentru butoanele de acțiune, atrăgând atenția utilizatorului asupra elementului cheie al interfeței.

Exemplul 2: PathInterpolator cu curbă personalizată

Curba personalizată cu efect overshoot — obiectul depășește poziția țintă cu 10% și revine. Punctele de control (0.4, 0.0, 0.6, 1.3) definesc o intrare accelerată cu depășire.

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 acceptă un Path cu curbă Bezier cubică. În exemplu, elementul „depășește" poziția țintă (y=1.3 la 60% din timp) și revine la final. Path trebuie să fie strict monoton pe axa x, altfel animația va merge înapoi. Pentru verificare, utilizați Layout Inspector în Android Studio.

Exemplul 3: BounceInterpolator personalizat

Interpolator propriu cu efect de salturi amortizate. Implementare prin TimeInterpolator cu patru cicluri de amortizare.

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

Interpolatorul personalizat DampedBounceInterpolator creează 4 salturi amortizate cu coeficient de amortizare 0.85. Metoda getInterpolation primește input liniar și returnează o valoare cu efect de „arc". În IT Sectr folosim acest interpolator pentru animația de apariție a notificărilor — saltul creează senzația de fizicitate și atrage atenția.

Întrebări frecvente

Cu ce se deosebește AccelerateDecelerateInterpolator de PathInterpolator?

AccelerateDecelerateInterpolator creează o curbă simetrică — obiectul accelerează la început și încetinește la sfârșit. PathInterpolator permite definirea unei curbe arbitrare prin Path cu punct de control (Bezier cubic). Pentru animația personalizată cu comportament asimetric (de exemplu, start rapid + final lent) utilizați PathInterpolator cu punctele de control (0.2, 0.8, 0.4, 1.0).

Se poate crea un Interpolator personalizat în Android?

Da, implementați interfața TimeInterpolator și suprascrieți metoda getInterpolation(input: Float): Float. Input — valoare fracționară de la 0 la 1 (progresul animației), output — valoarea reală. De exemplu, efectul bounce se implementează prin returnarea valorilor mai mari de 1 sau mai mici de 0 pentru comportament elastic. Înregistrați interpolatorul prin tagul XML sau utilizați direct în cod.

PathInterpolator este disponibil pe toate versiunile Android?

PathInterpolator a fost adăugat în API 21 (Android 5.0 Lollipop). Pentru versiunile mai vechi utilizați AccelerateDecelerateInterpolator sau un TimeInterpolator personalizat. PathInterpolator acceptă doar curbe Bezier cubice cu două puncte de control — liniile drepte și curbele pătratice pot da o interpolare incorectă. Pentru compatibilitate inversă, utilizați AccelerateDecelerateInterpolator ca fallback.

Ce interpolator recomandă Material Design?

Material Design 3 recomandă curba fast-out-slow-in cu punctele de control (0.4, 0.0, 0.2, 1.0) pentru apariția elementelor, linear-out-slow-in (0.0, 0.0, 0.2, 1.0) pentru dispariție și fast-out-linear-in (0.4, 0.0, 1.0, 1.0) pentru mișcare. În Android, aceste curbe sunt implementate în clasa FastOutSlowInInterpolator din biblioteca Material Components.

Interpolator afectează performanța animației?

Minim. Interpolatoarele încorporate execută o operație matematică per cadru — overheadul este imperceptibil. Interpolatoarele personalizate cu calcule grele (trigonometrie, bucle) pot cauza micro-jank pe dispozitive slabe. Optimizați prin precalcularea valorilor în constructor sau utilizați TimeInterpolator cu cache.

Rezumat

  • Interpolator — funcție matematică care transformă progresul liniar al animației într-o curbă neliniară a vitezei, făcând mișcarea naturală.
  • 9 interpolatoare Android încorporate acoperă 90% din scenarii — de la mișcarea liniară până la salturi fizice.
  • PathInterpolator (API 21+) definește o curbă Bezier personalizată cu două puncte de control pentru controlul precis al animației.
  • TimeInterpolator — interfață pentru crearea propriilor interpolatoare cu matematică arbitrară.
  • Material Design recomandă fast-out-slow-in pentru apariție, linear-out-slow-in pentru dispariția elementelor.
  • AccelerateDecelerateInterpolator — alegere universală pentru animații simetrice cu început și sfârșit line.
  • Interpolatoarele personalizate cu salturi amortizate creează comportament fizic pentru notificări și elemente interactive.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și