Easing: mahiyyəti, mobil animasiyada yumşaltma funksiyaları

Müəllif: IT Sectr Dərc olunub: 2026-03-02 Oxuma vaxtı: 8 dəq
Easing (yumşaltma funksiyası) — zaman ərzində animasiya parametrinin dəyişmə sürətini təyin edən riyazi əyri. Xətti bərabər sürətlənmiş hərəkət əvəzinə, easing fiziki davranışı təqlid edir: obyekt sürətlənə (ease-in), yavaşlaya (ease-out) və ya hər ikisini edə (ease-in-out) bilər. iOS-da easing CAMediaTimingFunction (Core Animation) sinfi və SwiftUI modifikatorları (Animation.easeInOut) vasitəsilə həyata keçirilir. Android-də — PathInterpolator və TimeInterpolator vasitəsilə. Apple Developer Sənədlərinə görə, düzgün seçilmiş easing əyrisi qavranılan animasiya müddətini faktiki müddəti dəyişmədən 20–35% qısaldır. IT Sectr-də biz ease-in-out (0.42, 0.0, 0.58, 1.0) əyrisini bütün mobil layihələr üçün korporativ standart olaraq təyin etdik.

Əsas məqamlar

  • Easing — fiziki hərəkəti təqlid edən animasiya sürət funksiyası: sürətlənmə, yavaşlama və ya kombinasiya.
  • CAMediaTimingFunction — 5 əvvəlcədən təyin edilmiş əyri və fərdi kubik Bézier ilə iOS Core Animation sinfi.
  • SwiftUI Animation — deklarativ easing üçün .easeIn, .easeOut, .easeInOut, .spring və .timingCurve modifikatorları.
  • PathInterpolator — iki nəzarət nöqtəsi ilə kubik Bézier əyrisi vasitəsilə Android-də easing analoqu.
  • Kubik Bézier — iOS, Android və web üçün ümumi olan easing əyrisi təyin etməyin universal formatı.

Easing nədir?

Easing (yumşaltma funksiyası) — xətti zaman gedişini t ∈ [0,1] qeyri-xətti animasiya dəyərinə çevirən riyazi f(t) funksiyası. Əgər animasiya obyektin mövqeyini A-dan B-yə 500 ms ərzində dəyişirsə, easing obyektin bu nöqtələr arasında hər bir zaman anında necə hərəkət etdiyini təyin edir. Xətti easing (f(t) = t) sabit sürət deməkdir — obyekt mexaniki hərəkət edir. Qeyri-xətti easing — təbii: obyekt sürətlənir (ease-in), yavaşlayır (ease-out) və ya hamar başlanğıc və sona malikdir (ease-in-out).

Easing funksiyaları kubik Bézier əyriləri (Cubic Bézier) ilə təsvir olunur, burada X oxu normallaşdırılmış vaxt, Y oxu normallaşdırılmış irəliləyişdir. İki nəzarət nöqtəsi (P1, P2) əyrinin formasını təyin edir. Standart əyrilər CSS spesifikasiyası ilə müəyyən edilmişdir: ease (0.25, 0.1, 0.25, 1.0), ease-in (0.42, 0.0, 1.0, 1.0), ease-out (0.0, 0.0, 0.58, 1.0), ease-in-out (0.42, 0.0, 0.58, 1.0). Eyni dəyərlər iOS-da CAMediaTimingFunction və Android-də PathInterpolator-da istifadə olunur. Material Design Motion təlimatlarına görə, easing əyriləri kontekstə uyğun olmalıdır: görünmə üçün — ease-out (sürətli başlanğıc), yox olma üçün — ease-in (sürətli son).

iOS-da Easing: CAMediaTimingFunction

iOS-da easing ilə əsas iş Core Animation-dan CAMediaTimingFunction sinfi vasitəsilə aparılır. O, iki nəzarət nöqtəsi (c1x, c1y, c2x, c2y) şəklində kubik Bézier əyrisini qəbul edir və CAAnimation-a (CABasicAnimation, CAKeyframeAnimation) tətbiq olunur. CAMediaTimingFunction 5 əvvəlcədən təyin edilmiş funksiyanı dəstəkləyir: linear, easeIn, easeOut, easeInEaseOut və default (easeInEaseOut-un ekvivalenti).

CAMediaTimingFunction CALayer səviyyəsində işləyir — animasiya render server adlanan ayrıca prosesdə icra olunur, bu da mürəkkəb transformasiyalarda belə 60fps təmin edir. UIView xüsusiyyətlərinin (frame, alpha, transform) animasiyası üçün UIKit UIView.animate-dən options: .curveEaseInOut parametri ilə istifadə edir, bu da daxili olaraq müvafiq əyri ilə CAMediaTimingFunction yaradır. iOS 17+-də fərdi Bézier üçün BlockParameters ilə UIViewAnimationCurve.custom əlavə edilib — bu, öz CAAnimation yazmaq ehtiyacını aradan qaldırır. CAMediaTimingFunction həmçinin UIKit Dynamics və UIScrollView-də deselerasiya üçün (UIScrollViewDecelerationRate) istifadə olunur.

SwiftUI-də Easing

SwiftUI-də easing Animation strukturu vasitəsilə .easeIn, .easeOut, .easeInOut, .spring və .interpolatingSpring modifikatorları ilə təyin edilir. UIKit-də animasiya prosedural olduğu halda (beginAnimations/commitAnimations), SwiftUI deklarativ yanaşmadan istifadə edir: animasiya dəyişən vəziyyət xüsusiyyətidir və framework keçidi necə animasiya edəcəyini özü müəyyən edir.

.timingCurve(c0x, c0y, c1x, c1y) modifikatoru birbaşa kubik Bézier nəzarət nöqtələrini qəbul edir — bu, CAMediaTimingFunction-in tam analoqudur. SwiftUI Animation əvvəlcədən təyin edilmiş əyriləri statik xüsusiyyətlər kimi dəstəkləyir: Animation.easeInOut ease-in-out (0.42, 0.0, 0.58, 1.0) ekvivalentidir. Yay animasiyası üçün Animation.spring(response:dampingFraction:blendDuration) istifadə olunur, burada dampingFraction < 1 sönümləmə ilə yay effekti yaradır. WWDC 2023-də Apple Animation.keyframes — hər bir əsas kadrda fərdi easing ilə kadr animasiyasını təqdim etdi ki, bu da trayektoriya üzərində tam nəzarət verir.

Android-də Easing: PathInterpolator

Android-də easing PathInterpolator (API 21+) — kubik Bézier əyrisi ilə Path obyektini qəbul edən sinif vasitəsilə həyata keçirilir. Nəzarət nöqtələri Path.cubicTo(x1, y1, x2, y2, x3, y3) vasitəsilə təyin edilir, burada (x1,y1) birinci nəzarət nöqtəsi, (x2,y2) ikinci, (x3,y3) son nöqtədir (həmişə 1,1). Fərdi əyri lazım olduqda PathInterpolator məcburidir; standart ssenarilər üçün AccelerateDecelerateInterpolator (ease-in-out), AccelerateInterpolator (ease-in) və DecelerateInterpolator (ease-out) mövcuddur.

Jetpack Compose-da easing androidx.compose.animation paketindən Easing obyekti vasitəsilə təyin edilir. FastOutSlowInEasing, LinearOutSlowInEasing, FastOutLinearInEasing, həmçinin CubicBezierEasing vasitəsilə fərdi Easing mövcuddur. Compose Easing animate*AsState, AnimatedVisibility və AnimatedContent-də tətbiq olunur. View sistemindən əsas fərq: Compose easing-i Kotlin tərəfində (RenderNode-da deyil) interpolyasiya edir ki, bu da fərdi animasiyalar üçün daha çox çeviklik verir, lakin 120Hz displeylərdə optimallaşdırma tələb edir.

Kod nümunələri

iOS: CAMediaTimingFunction CABasicAnimation ilə

Fərdi ease-in-out əyrisi ilə təbəqə mövqeyinin əsas animasiyası. CAMediaTimingFunction hərəkətin hamar başlanğıcını və sonunu təyin edən kubik Bézier nəzarət nöqtələrini qəbul edir.

swift
import UIKit

func animateLayerPosition() {
    let animation = CABasicAnimation(keyPath: "position")
    animation.fromValue = CGPoint(x: 0, y: 0)
    animation.toValue = CGPoint(x: 300, y: 400)
    animation.duration = 0.8

    let easing = CAMediaTimingFunction(
        controlPoints: 0.42, 0.0, 0.58, 1.0
    )
    animation.timingFunction = easing
    animation.fillMode = .forwards
    animation.isRemovedOnCompletion = false

    layer.add(animation, forKey: "positionAnimation")
}

Nəzarət nöqtələri (0.42, 0.0, 0.58, 1.0) standart ease-in-out əyrisini təyin edir. SwiftUI Animation.easeInOut üçün eyni nöqtələrdən istifadə edir. Ease-in üçün (0.42, 0.0, 1.0, 1.0), ease-out üçün — (0.0, 0.0, 0.58, 1.0) tətbiq edin. Core Animation animasiyanı render server-də 60/120 fps tezliyi ilə icra edir.

SwiftUI: timingCurve ilə Easing

SwiftUI-də fərdi əyri və yay effekti ilə deklarativ animasiya. animation modifikatoru isAnimated dəyişikliyinə bağlanır.

swift
import SwiftUI

struct EasingExampleView: View {
    @State private var isAnimated = false

    var body: some View {
        VStack {
            Circle()
                .fill(Color.blue)
                .frame(width: 60, height: 60)
                .offset(x: isAnimated ? 100 : 0, y: 0)
                .animation(
                    .timingCurve(0.42, 0.0, 0.58, 1.0, duration: 0.6),
                    value: isAnimated
                )

            Button("Toggle") {
                isAnimated.toggle()
            }
        }
    }
}

.timingCurve(c0x, c0y, c1x, c1y, duration) modifikatoru SwiftUI-də fərdi easing animasiyası yaradır. value parametri animasiyanı konkret vəziyyətlə əlaqələndirir — isAnimated dəyişdikdə SwiftUI avtomatik olaraq əyrini tətbiq edir. Yay animasiyası üçün timingCurve əvəzinə .spring(response: 0.4, dampingFraction: 0.6) istifadə edin.

Android: PathInterpolator fərdi easing ilə

Android-də PathInterpolator vasitəsilə ease-in-out ekvivalenti. Nəzarət nöqtələri (0.42, 0.0, 0.58, 1.0) iOS-da olduğu kimi eyni əyrini təyin edir.

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

fun View.fadeInWithEase() {
    val path = Path().apply {
        cubicTo(0.42f, 0.0f, 0.58f, 1.0f, 1.0f, 1.0f)
    }
    val interpolator = PathInterpolator(path)

    ObjectAnimator.ofFloat(this, "alpha", 0f, 1f).apply {
        duration = 500
        interpolator = interpolator
        start()
    }
}

PathInterpolator (0.42, 0.0, 0.58, 1.0) nəzarət nöqtələri ilə iOS-da CAMediaTimingFunction ease-in-out ilə eynidir. Platformalararası layihələr üçün eyni nəzarət nöqtələrindən istifadə edin — bu, vizual olaraq eyni animasiya davranışını təmin edir. Material Design Android-spesifik interfeyslər üçün alternativ olaraq FastOutSlowInInterpolator (0.4, 0.0, 0.2, 1.0) tövsiyə edir.

Jetpack Compose: CubicBezierEasing ilə Easing

Compose-da easing eyni nəzarət nöqtələri ilə CubicBezierEasing vasitəsilə təyin edilir. Nəticə — şəffaflıq və yerdəyişmə ilə elementin hamar görünməsi.

kotlin
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.CubicBezierEasing
import androidx.compose.animation.core.tween
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*

@Composable
fun EasingComposable() {
    var visible by remember { mutableStateOf(false) }
    val easing = CubicBezierEasing(0.42f, 0.0f, 0.58f, 1.0f)

    val alpha by animateFloatAsState(
        targetValue = if (visible) 1f else 0f,
        animationSpec = tween(durationMillis = 500, easing = easing)
    )

    Column {
        Button(onClick = { visible = !visible }) {
            Text("Toggle")
        }

        Box(
            modifier = Modifier
                .size(100.dp)
                .graphicsLayer(alpha = alpha)
                .background(MaterialTheme.colorScheme.primary)
        )
    }
}

Compose-da CubicBezierEasing eyni 4 nəzarət nöqtəsi parametrini qəbul edir. animateFloatAsState alpha dəyərini verilmiş əyri ilə avtomatik interpolyasiya edir. Müqayisə üçün: Compose-da FastOutSlowInEasing (0.4, 0.0, 0.2, 1.0) — Material Design 3 standart əyrisinə ekvivalentdir. CubicBezierEasing vasitəsilə fərdi əyrilər brend animasiyaları üçün tam nəzarət verir.

Tez-tez verilən suallar

Easing interpolatordan nə ilə fərqlənir?

Easing — iOS (CAMediaTimingFunction), web (CSS ease-in-out) və dizaynda istifadə olunan yumşaltma funksiyasının ümumi anlayışıdır. Interpolator — bu konsepsiyanın Android-də (TimeInterpolator) həyata keçirilməsidir. Əslində bu eynidir — animasiya sürətinin riyazi əyrisi. Fərq yalnız ad və platforma API-dədir. Platformalararası layihələrdə easing termini universal olaraq istifadə olunur.

iOS-da hansı easing funksiyaları mövcuddur?

iOS 5 əvvəlcədən təyin edilmiş funksiya ilə CAMediaTimingFunction təqdim edir: linear, easeIn, easeOut, easeInEaseOut və custom (kubik Bézier). SwiftUI-də Animation.easeIn, Animation.easeOut, Animation.easeInOut, Animation.spring və Animation.interpolatingSpring mövcuddur. Fərdi əyrilər üçün Animation.timingCurve(c0x, c0y, c1x, c1y, duration:) istifadə edin.

iOS və Android-də eyni easing funksiyasından istifadə etmək mümkündürmü?

Bəli, eyni kubik Bézier əyrisini təyin etsəniz. iOS-da CAMediaTimingFunction və Android-də PathInterpolator kubik Bézier nəzarət nöqtələrini (x1, y1, x2, y2) qəbul edir. Məsələn, ease-in-out (0.42, 0.0, 0.58, 1.0) əyrisi hər iki platformada eyni davranışı verəcəkdir. Material Design platformalararası animasiyalar üçün bu yanaşmanı istifadə edir.

Tətbiqim üçün düzgün easing əyrisini necə seçməliyəm?

Material Design Motion təlimatlarından istifadə edin: elementlərin görünməsi üçün — ease-out (sürətli başlanğıc, hamar son), yox olması üçün — ease-in (sürətli son), ekranlar arasında hərəkət üçün — ease-in-out. Yay animasiyasını interaktiv elementlər (düymələr, kartlar) üçün istifadə edin. Linear-dən çəkinin — qeyri-təbii görünür.

Easing ilə animasiyam niyə sıçrayışlı görünür?

Sıçrayışlılıq (jank) animasiya 60fps-ə çatmadıqda baş verir. Yoxlayın: iOS-da CAMediaTimingFunction (timer yox), Android-də PathInterpolator (Handler.post yox) istifadə edirsinizmi. Əsas thread-də ağır hesablamalar, mürəkkəb təbəqə iyerarxiyası və ya böyük drawable kadr buraxılmasına səbəb ola bilər. iOS-da mürəkkəb təbəqələr üçün shouldRasterize ilə Core Animation, Android-də Hardware Acceleration və GPU rendering istifadə edin.

Nəticə

  • Easing — zaman ərzində parametrlərin qeyri-xətti dəyişməsi ilə hərəkəti təbii edən animasiya sürət funksiyasıdır.
  • iOS CAMediaTimingFunction və SwiftUI Animation.timingCurve iki nəzarət nöqtəsi ilə kubik Bézier əyrisi vasitəsilə easing həyata keçirir.
  • Android PathInterpolator və Compose CubicBezierEasing — fərdi yumşaltma əyriləri üçün iOS-un tam analoqları.
  • Platformalararası easing əyriləri eyni nəzarət nöqtələri ilə təyin olunur — animasiyaların unifikasiyasının əsası.
  • Material Design 3 görünmə üçün fast-out-slow-in, yox olma üçün linear-out-slow-in tövsiyə edir.
  • SwiftUI (Animation.spring) və Compose-da (spring()) yay animasiyası dampingFraction ilə fiziki yay effekti yaradır.
  • Linear easing interfeys animasiyaları üçün tövsiyə edilmir — qeyri-təbii və mexaniki görünür.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun