Easing: mohiyati, mobil animatsiyada yumshatish funksiyalari

Muallif: IT Sectr Nashr etilgan: 2026-03-02 O'qish vaqti: 8 daq
Easing (yumshatish funksiyasi) — vaqt davomida animatsiya parametrining o'zgarish tezligini belgilaydigan matematik egri chiziq. Chiziqli tekis tezlashtirilgan harakat o'rniga, easing fizik xatti-harakatni taqlid qiladi: ob'ekt tezlashishi (ease-in), sekinlashishi (ease-out) yoki ikkalasini ham qilishi (ease-in-out) mumkin. iOS-da easing CAMediaTimingFunction (Core Animation) sinfi va SwiftUI modifikatorlari (Animation.easeInOut) orqali amalga oshiriladi. Android-da — PathInterpolator va TimeInterpolator orqali. Apple Developer hujjatlariga ko'ra, to'g'ri tanlangan easing egri chizig'i animatsiyaning qabul qilinadigan vaqtini haqiqiy davomiylikni o'zgartirmasdan 20–35% ga qisqartiradi. IT Sectr-da biz ease-in-out (0.42, 0.0, 0.58, 1.0) egri chizig'ini barcha mobil loyihalar uchun korporativ standart sifatida belgiladik.

Asosiy xulosalar

  • Easing — fizik harakatni taqlid qiluvchi animatsiya tezlik funksiyasi: tezlashish, sekinlashish yoki kombinatsiya.
  • CAMediaTimingFunction — 5 oldindan belgilangan egri chiziq va maxsus kubik Bézier bilan iOS Core Animation sinfi.
  • SwiftUI Animation — deklarativ easing uchun .easeIn, .easeOut, .easeInOut, .spring va .timingCurve modifikatorlari.
  • PathInterpolator — ikki nazorat nuqtasi orqali kubik Bézier egri chizig'i bilan Android-da easing analogi.
  • Kubik Bézier — iOS, Android va web uchun umumiy bo'lgan easing egri chizig'ini belgilashning universal formati.

Easing nima?

Easing (yumshatish funksiyasi) — t ∈ [0,1] vaqtning chiziqli borishini animatsiyaning chiziqli bo'lmagan qiymatiga aks ettiruvchi matematik f(t) funksiyasi. Agar animatsiya ob'ektning holatini A dan B gacha 500 ms ichida o'zgartirsa, easing ob'ektning har bir vaqt momentida bu nuqtalar orasida qanday harakatlanishini belgilaydi. Chiziqli easing (f(t) = t) doimiy tezlikni anglatadi — ob'ekt mexanik harakat qiladi. Chiziqli bo'lmagan easing — tabiiy: ob'ekt tezlashadi (ease-in), sekinlashadi (ease-out) yoki silliq boshlanish va tugashga ega (ease-in-out).

Easing funksiyalari kubik Bézier egri chiziqlari (Cubic Bézier) bilan tavsiflanadi, bu erda X o'qi normallashtirilgan vaqt, Y o'qi normallashtirilgan taraqqiyotdir. Ikki nazorat nuqtasi (P1, P2) egri chiziq shaklini belgilaydi. Standart egri chiziqlar CSS spetsifikatsiyasi bilan belgilangan: 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). Xuddi shu qiymatlar iOS-da CAMediaTimingFunction va Android-da PathInterpolator da ishlatiladi. Material Design Motion ko'rsatmalariga ko'ra, easing egri chiziqlari kontekstga mos kelishi kerak: paydo bo'lish uchun — ease-out (tez boshlanish), yo'qolish uchun — ease-in (tez tugash).

iOS-da Easing: CAMediaTimingFunction

iOS-da easing bilan asosiy ish Core Animation dan CAMediaTimingFunction sinfi orqali amalga oshiriladi. U ikki nazorat nuqtasi (c1x, c1y, c2x, c2y) ko'rinishidagi kubik Bézier egri chizig'ini qabul qiladi va CAAnimation (CABasicAnimation, CAKeyframeAnimation) ga qo'llaniladi. CAMediaTimingFunction 5 oldindan belgilangan funksiyani qo'llab-quvvatlaydi: linear, easeIn, easeOut, easeInEaseOut va default (easeInEaseOut ekvivalenti).

CAMediaTimingFunction CALayer darajasida ishlaydi — animatsiya render server deb nomlangan alohida jarayonda bajariladi, bu hatto murakkab transformatsiyalarda ham 60fps ni kafolatlaydi. UIView xususiyatlarining (frame, alpha, transform) animatsiyasi uchun UIKit UIView.animate dan options: .curveEaseInOut parametri bilan foydalanadi, bu ichki ravishda tegishli egri chiziq bilan CAMediaTimingFunction yaratadi. iOS 17+ da maxsus Bézier uchun BlockParameters bilan UIViewAnimationCurve.custom qo'shilgan — bu o'z CAAnimation yozish zaruratini bartaraf qiladi. CAMediaTimingFunction shuningdek UIKit Dynamics va UIScrollView da sekinlashish (UIScrollViewDecelerationRate) uchun ishlatiladi.

SwiftUI-da Easing

SwiftUI-da easing Animation strukturasi orqali .easeIn, .easeOut, .easeInOut, .spring va .interpolatingSpring modifikatorlari bilan belgilanadi. UIKit-da animatsiya protsedural bo'lgan holda (beginAnimations/commitAnimations), SwiftUI deklarativ yondashuvdan foydalanadi: animatsiya o'zgaruvchan holat xususiyatidir va freymvork o'tishni qanday animatsiya qilishni o'zi belgilaydi.

.timingCurve(c0x, c0y, c1x, c1y) modifikatori to'g'ridan-to'g'ri kubik Bézier nazorat nuqtalarini qabul qiladi — bu CAMediaTimingFunction ning to'liq analogidir. SwiftUI Animation oldindan belgilangan egri chiziqlarni statik xususiyatlar sifatida qo'llab-quvvatlaydi: Animation.easeInOut ease-in-out (0.42, 0.0, 0.58, 1.0) ga ekvivalentdir. Bahor animatsiyasi uchun Animation.spring(response:dampingFraction:blendDuration) ishlatiladi, bu erda dampingFraction < 1 so'nish bilan bahor effektini yaratadi. WWDC 2023 da Apple Animation.keyframes — har bir asosiy kadrda maxsus easing bilan kadr animatsiyasini taqdim etdi, bu traektoriya ustida to'liq nazorat beradi.

Android-da Easing: PathInterpolator

Android-da easing PathInterpolator (API 21+) — kubik Bézier egri chizig'i bilan Path ob'ektini qabul qiluvchi sinf orqali amalga oshiriladi. Nazorat nuqtalari Path.cubicTo(x1, y1, x2, y2, x3, y3) orqali belgilanadi, bu erda (x1,y1) birinchi nazorat nuqtasi, (x2,y2) ikkinchi, (x3,y3) oxirgi nuqta (har doim 1,1). Maxsus egri chiziq kerak bo'lganda PathInterpolator majburiy; standart stsenariylar uchun AccelerateDecelerateInterpolator (ease-in-out), AccelerateInterpolator (ease-in) va DecelerateInterpolator (ease-out) mavjud.

Jetpack Compose-da easing androidx.compose.animation paketidan Easing ob'ekti orqali belgilanadi. FastOutSlowInEasing, LinearOutSlowInEasing, FastOutLinearInEasing, shuningdek CubicBezierEasing orqali maxsus Easing mavjud. Compose Easing animate*AsState, AnimatedVisibility va AnimatedContent da qo'llaniladi. View tizimidan asosiy farq: Compose easing ni Kotlin tomonida (RenderNode da emas) interpolyatsiya qiladi, bu maxsus animatsiyalar uchun ko'proq moslashuvchanlik beradi, ammo 120Hz displeylarda optimallashtirishni talab qiladi.

Kod misollari

iOS: CAMediaTimingFunction CABasicAnimation bilan

Maxsus ease-in-out egri chizig'i bilan qatlam holatining asosiy animatsiyasi. CAMediaTimingFunction harakatning silliq boshlanishi va tugashini belgilovchi kubik Bézier nazorat nuqtalarini qabul qiladi.

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

Nazorat nuqtalari (0.42, 0.0, 0.58, 1.0) standart ease-in-out egri chizig'ini belgilaydi. SwiftUI Animation.easeInOut uchun xuddi shu nuqtalardan foydalanadi. Ease-in uchun (0.42, 0.0, 1.0, 1.0), ease-out uchun — (0.0, 0.0, 0.58, 1.0) qo'llang. Core Animation animatsiyani render server da 60/120 fps chastotasi bilan bajaradi.

SwiftUI: timingCurve bilan Easing

SwiftUI-da maxsus egri chiziq va bahor effekti bilan deklarativ animatsiya. animation modifikatori isAnimated o'zgarishiga bog'lanadi.

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) modifikatori SwiftUI-da maxsus easing animatsiyasini yaratadi. value parametri animatsiyani aniq holat bilan bog'laydi — isAnimated o'zgarganda SwiftUI avtomatik ravishda egri chiziqni qo'llaydi. Bahor animatsiyasi uchun timingCurve o'rniga .spring(response: 0.4, dampingFraction: 0.6) dan foydalaning.

Android: PathInterpolator maxsus easing bilan

Android-da PathInterpolator orqali ease-in-out ekvivalenti. Nazorat nuqtalari (0.42, 0.0, 0.58, 1.0) iOS-da bo'lgani kabi bir xil egri chiziqni belgilaydi.

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) nazorat nuqtalari bilan iOS-dagi CAMediaTimingFunction ease-in-out bilan bir xil. Platformalararo loyihalar uchun bir xil nazorat nuqtalaridan foydalaning — bu vizual bir xil animatsiya xatti-harakatini kafolatlaydi. Material Design Android-spesifik interfeyslar uchun muqobil sifatida FastOutSlowInInterpolator (0.4, 0.0, 0.2, 1.0) ni tavsiya qiladi.

Jetpack Compose: CubicBezierEasing bilan Easing

Compose-da easing bir xil nazorat nuqtalari bilan CubicBezierEasing orqali belgilanadi. Natija — shaffoflik va siljish bilan elementning silliq paydo bo'lishi.

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 bir xil 4 nazorat nuqtasi parametrini qabul qiladi. animateFloatAsState alpha qiymatini berilgan egri chiziq bilan avtomatik interpolyatsiya qiladi. Taqqoslash uchun: Compose-da FastOutSlowInEasing (0.4, 0.0, 0.2, 1.0) — Material Design 3 standart egri chizig'iga ekvivalent. CubicBezierEasing orqali maxsus egri chiziqlar brend animatsiyalari uchun to'liq nazorat beradi.

Tez-tez so'raladigan savollar

Easing interpolatordan qanday farq qiladi?

Easing — iOS (CAMediaTimingFunction), web (CSS ease-in-out) va dizaynda ishlatiladigan yumshatish funksiyasining umumiy tushunchasi. Interpolator — bu kontseptsiyaning Android-da (TimeInterpolator) amalga oshirilishi. Mohiyatan bu bir xil — animatsiya tezligining matematik egri chizig'i. Farq faqat nom va platforma API-sida. Platformalararo loyihalarda easing termini universal sifatida ishlatiladi.

iOS-da qanday easing funksiyalari mavjud?

iOS 5 oldindan belgilangan funksiya bilan CAMediaTimingFunction ni taqdim etadi: linear, easeIn, easeOut, easeInEaseOut va custom (kubik Bézier). SwiftUI-da Animation.easeIn, Animation.easeOut, Animation.easeInOut, Animation.spring va Animation.interpolatingSpring mavjud. Maxsus egri chiziqlar uchun Animation.timingCurve(c0x, c0y, c1x, c1y, duration:) dan foydalaning.

iOS va Android-da bir xil easing funksiyasidan foydalanish mumkinmi?

Ha, bir xil kubik Bézier egri chizig'ini o'rnatsangiz. iOS-da CAMediaTimingFunction va Android-da PathInterpolator kubik Bézier nazorat nuqtalarini (x1, y1, x2, y2) qabul qiladi. Masalan, ease-in-out (0.42, 0.0, 0.58, 1.0) egri chizig'i ikkala platformada bir xil xatti-harakatni beradi. Material Design platformalararo animatsiyalar uchun ushbu yondashuvdan foydalanadi.

Ilovam uchun to'g'ri easing egri chizig'ini qanday tanlashim kerak?

Material Design Motion ko'rsatmalaridan foydalaning: elementlarning paydo bo'lishi uchun — ease-out (tez boshlanish, silliq tugash), yo'qolishi uchun — ease-in (tez tugash), ekranlar orasida harakatlanish uchun — ease-in-out. Bahor animatsiyasini interaktiv elementlar (tugmalar, kartalar) uchun ishlating. Linear dan saqlaning — g'ayritabiiy ko'rinadi.

Easing bilan animatsiyam nima uchun silkinishli ko'rinadi?

Silkinish (jank) animatsiya 60fps ga yetmaganda yuz beradi. Tekshiring: iOS-da CAMediaTimingFunction (timer emas), Android-da PathInterpolator (Handler.post emas) ishlatyapsizmi. Asosiy oqimdagi og'ir hisob-kitoblar, murakkab qatlam ierarxiyasi yoki katta drawable kadr tashlashga sabab bo'lishi mumkin. iOS-da murakkab qatlamlar uchun Core Animation ni shouldRasterize bilan, Android-da Hardware Acceleration va GPU rendering dan foydalaning.

Xulosa

  • Easing — vaqt davomida parametrlarning chiziqli bo'lmagan o'zgarishi orqali harakatni tabiiy qiladigan animatsiya tezlik funksiyasi.
  • iOS CAMediaTimingFunction va SwiftUI Animation.timingCurve ikki nazorat nuqtasi bilan kubik Bézier egri chizig'i orqali easing ni amalga oshiradi.
  • Android PathInterpolator va Compose CubicBezierEasing — maxsus yumshatish egri chiziqlari uchun iOS ning to'liq analoglari.
  • Platformalararo easing egri chiziqlari bir xil nazorat nuqtalari bilan belgilanadi — animatsiyalarni unifikatsiya qilish asosi.
  • Material Design 3 paydo bo'lish uchun fast-out-slow-in, yo'qolish uchun linear-out-slow-in ni tavsiya qiladi.
  • SwiftUI (Animation.spring) va Compose (spring()) da bahor animatsiyasi dampingFraction bilan fizik bahor effektini yaratadi.
  • Linear easing interfeys animatsiyalari uchun tavsiya etilmaydi — g'ayritabiiy va mexanik ko'rinadi.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing