Huvudpunkter
Interpolator — gränssnitt i Android som mappar bråkdalsvärdet för animationens framsteg (från 0.0 till 1.0) till det faktiska värdet med ändrad hastighet. Om animationen varar 300 millisekunder anropar systemet Interpolator för varje bildruta och skickar den aktuella framstegen. Interpolator returnerar ett modifierat värde — till exempel för AccelerateInterpolator vid 50% av tiden färdas animationen endast ~25% av vägen, vilket simulerar acceleration.
Matematiskt kan Interpolator representeras som funktionen f(t), där t är den normaliserade tiden [0, 1] och f(t) är det normaliserade värdet [0, 1] (eller bredare för Overshoot/Bounce). Den linjära interpolatorn returnerar f(t) = t — objektet rör sig med konstant hastighet. AccelerateInterpolator approximerar f(t) = t², DecelerateInterpolator — f(t) = 1 − (1 − t)², vilket skapar en mjuk start eller avslutning. I Android Animation Framework tillämpas Interpolator på både ValueAnimator och ObjectAnimator och ViewPropertyAnimator, vilket ger ett enhetligt tillvägagångssätt för hastighetshantering på alla nivåer.
Android erbjuder 9 inbyggda interpolatorer, var och en med sin egen matematiska modell. Valet av interpolator bestämmer animationens karaktär: fysikalitet (Bounce), elasticitet (Overshoot) eller jämnhet (AccelerateDecelerate).
| Interpolator | Matematik | Scenario |
|---|---|---|
| LinearInterpolator | f(t) = t | Framstegsindikatorer, löpande band |
| AccelerateInterpolator | f(t) = tⁿ (n=2) | Element som flyger ut ur skärmen, visas från botten |
| DecelerateInterpolator | f(t) = 1 − (1 − t)ⁿ | Objekt som faller, inträde uppifrån med inbromsning |
| AccelerateDecelerateInterpolator | Cos-approximation | Universell, visa/dölja element |
| AnticipateInterpolator | Kubisk med tillbakadragning | Fjädrande inträde — objektet drar sig tillbaka lite före start |
| OvershootInterpolator | Kubisk med överskridning | Åtgärdsknapp — överskrider målpositionen något |
| AnticipateOvershootInterpolator | Kombination av Anticipate + Overshoot | Kort — tillbakadragning + överskridning med återgång |
| BounceInterpolator | Dämpade studsar | Boll, element som faller på en yta |
| PathInterpolator | Kubisk Bezier (2 kontrollpunkter) | Anpassade kurvor för designsystem |
Varje interpolator har en XML-deklaration i res/interpolator/ och en Kotlin-klass i paketet android.view.animation. AccelerateDecelerateInterpolator — den mest använda: dess kurva påminner om easing-funktionen ease-in-out i CSS. För Android-applikationer med Material Design rekommenderas OvershootInterpolator för floating action button (FAB) — skapar en 'hoppande' effekt vid visning.
PathInterpolator — interpolator baserad på Bezier-kurva, definierad via ett Path-objekt. Tillgänglig från API 21 (Android 5.0). Gör det möjligt att visuellt designa hastighetskurvan — designern ritar kurvan, utvecklaren överför den till kod via kontrollpunkternas koordinater. Endast kubisk Bezier (två kontrollpunkter C1, C2) stöds.
PathInterpolator-kurvan börjar alltid i punkten (0,0) och slutar i (1,1). Kontrollpunkterna bestämmer formen: (x1, y1) — punkt i början, (x2, y2) — i slutet. x-värden måste vara i intervallet [0,1] — detta garanterar monotonitet över tid. y-värden kan gå utanför [0,1] — detta skapar en effekt av överskridning (overshoot) eller tillbakadragning (anticipate). Till exempel använder standard Material Design kurvan fast-out-slow-in med kontrollpunkter (0.4, 0.0, 0.2, 1.0). Hos IT Sectr bygger vi anpassade PathInterpolator för varje designsystem — detta garanterar enhetlighet i animationer på alla skärmar.
Om de inbyggda interpolatorerna inte täcker scenariot gör Android det möjligt att skapa en egen genom att implementera gränssnittet TimeInterpolator. Den enda metoden — getInterpolation(input: Float): Float. Input — aktuellt animationsframsteg från 0 till 1; output — modifierat värde. Output kan gå utanför [0,1] för effekter av överskridning eller studs.
Typiska anpassade interpolatorer: bounce-effekt med dämpning (gå utanför 1.0 och återgå), elastic-effekt (sinusformad dämpning), step-interpolator (diskreta hopp). Anpassade interpolatorer kan också definieras via XML med taggen <interpolator> och klassangivelse. I Android Studio finns en inbyggd Interpolator-förhandsvisning i Layout Inspector — visar den faktiska kurvan för den valda interpolatorn, vilket underlättar felsökning.
Grundläggande animation av en knapps skala med hjälp av en symmetrisk interpolator. ValueAnimator ändrar värdet från 1.0 till 1.2 och tillbaka, och AccelerateDecelerateInterpolator gör rörelsen jämn.
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 skapar en mjuk ökning i början och en mjuk återgång i slutet. Metoden REVERSE upprepar animationen i motsatt riktning och skapar en pulserande effekt. Detta mönster används för åtgärdsknappar och drar användarens uppmärksamhet till gränssnittets nyckelelement.
Anpassad kurva med overshoot-effekt — objektet överskrider målpositionen med 10% och återgår. Kontrollpunkterna (0.4, 0.0, 0.6, 1.3) bestämmer en accelererad start med överskridning.
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 accepterar en Path med kubisk Bezier-kurva. I exemplet 'överskrider' elementet målpositionen (y=1.3 vid 60% av tiden) och återgår till slutpunkten. Path måste vara strikt monoton längs x-axeln, annars går animationen baklänges. För verifiering använd Layout Inspector i Android Studio.
Egen interpolator med dämpad studseffekt. Implementering via TimeInterpolator med fyra dämpningscykler.
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)
}
}
Den anpassade DampedBounceInterpolator skapar 4 dämpade studsar med dämpningskoefficient 0.85. Metoden getInterpolation tar emot linjär input och returnerar ett värde med 'fjädereffekt'. Hos IT Sectr använder vi denna interpolator för animationsvisning av notifikationer — studsen skapar en känsla av fysikalitet och drar uppmärksamhet.
Vanliga frågor
AccelerateDecelerateInterpolator skapar en symmetrisk kurva — objektet accelererar i början och saktar ner i slutet. PathInterpolator gör det möjligt att definiera en godtycklig kurva via Path med en kontrollpunkt (kubisk Bezier). För anpassad animation med asymmetriskt beteende (t.ex. snabb start + långsam avslutning) använd PathInterpolator med kontrollpunkter (0.2, 0.8, 0.4, 1.0).
Ja, implementera gränssnittet TimeInterpolator och åsidosätt metoden getInterpolation(input: Float): Float. Input — bråkdalsvärde från 0 till 1 (animationsframsteg), output — faktiskt värde. Till exempel implementeras bounce-effekten genom att returnera värden större än 1 eller mindre än 0 för fjädrande beteende. Registrera interpolatorn via XML-taggen
PathInterpolator lades till i API 21 (Android 5.0 Lollipop). För äldre versioner använd AccelerateDecelerateInterpolator eller anpassad TimeInterpolator. PathInterpolator stöder endast kubiska Bezier-kurvor med två kontrollpunkter — raka linjer och kvadratiska kurvor kan ge felaktig interpolering. För bakåtkompatibilitet använd AccelerateDecelerateInterpolator som fallback.
Material Design 3 rekommenderar kurvan fast-out-slow-in med kontrollpunkter (0.4, 0.0, 0.2, 1.0) för att visa element, linear-out-slow-in (0.0, 0.0, 0.2, 1.0) för att dölja och fast-out-linear-in (0.4, 0.0, 1.0, 1.0) för rörelse. I Android är dessa kurvor implementerade i klassen FastOutSlowInInterpolator från Material Components-biblioteket.
Minimalt. Inbyggda interpolatorer utför en matematisk operation per bildruta — överhead är omärkbar. Anpassade interpolatorer med tunga beräkningar (trigonometri, loopar) kan orsaka micro-jank på svaga enheter. Optimera genom förberäkning av värden i konstruktorn eller använd TimeInterpolator med cachning.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också