Timeline — asoslar, ilovalarda animatsiya vaqtini boshqarish

Muallif: IT Sectr Nashr etilgan: 2026-03-02 O'qish vaqti: 8 daq
Timeline (vaqt shkalasi) — animatsiyaning qancha davom etishini, uning bosqichlari qanday tartibda bajarilishini va vaqtning taraqqiyotga qanday aks ettirilishini belgilaydigan fundamental animatsiya kontseptsiyasi. Mobil ilovalarni ishlab chiqishda timeline davomiylik (duration), kechikish (delay), takrorlash (repeat) va vaqt belgilari orqali boshqariladi. iOS-da animatsion timeline CACurrentMediaTime va CAMediaTiming orqali, Android-da esa ValueAnimator va Animator orqali duration, startDelay va repeatCount parametrlari bilan amalga oshiriladi. Apple Hujjatlariga ko‘ra, vaqt shkalasini aniq boshqarish animatsiyalarni sinxronlashtirish uchun juda muhim: hatto 16 ms (60fps da bitta kadr) desinxronizatsiya foydalanuvchi tomonidan silkinish sifatida qabul qilinadi. IT Sectr-da biz Android-da ValueAnimator va iOS-da CAMediaTiming bilan CABasicAnimation orqali timeline dan foydalanishni standartlashtirdik — bu barcha loyihalarda yagona vaqt boshqaruvini ta’minlaydi.

Asosiylar

  • Timeline — animatsiya vaqtini boshqarish kontseptsiyasi: duration, delay, repeat, vaqtni taraqqiyotga aks ettirish.
  • CAMediaTiming — timeline boshqaruvi uchun iOS Core Animation protokoli: duration, beginTime, repeatCount, speed, timeOffset.
  • ValueAnimator — duration, startDelay, repeatCount orqali animatsiya vaqt shkalasi bilan ishlash uchun Android markaziy sinfi.
  • CACurrentMediaTime — soniyalarda mutlaq vaqtni olish uchun iOS funksiyasi, sinxronizatsiya uchun ishlatiladi.
  • TimeInterval — iOS-da animatsiya hisob-kitoblari uchun vaqt oralig‘ini ifodalovchi ma’lumot turi (Double).

Timeline nima?

Timeline — animatsiyaning qachon boshlanishini, qancha davom etishini va vaqt o‘tishining animatsiya qilinadigan parametr o‘zgarishiga qanday aylantirilishini belgilaydigan animatsiya vaqt modeli. Har bir kadr qo‘lda o‘rnatiladigan kadrma-kadr (frame-by-frame) animatsiyadan farqli o‘laroq, timeline animatsiyasi parametrlar bilan tavsiflanadi: duration — umumiy davomiylik, startDelay — boshlashdan oldin kechikish, repeatCount — takrorlar soni va timingFunction — tezlik egri chizig‘i.

Vaqt shkalasi normallashtirilgan [0, 1] fazosida ishlaydi — local time yoki progress. Nol qiymati animatsiyaning boshlanishiga, bir — tugashiga mos keladi. Easing funksiyasi chiziqli local time ni haqiqiy animatsiya taraqqiyotiga aylantiradi. Agar repeatCount > 1 bo‘lsa, timeline davriy ravishda tiklanadi (RESTART) yoki teskari aylantiriladi (REVERSE). iOS da CAMediaTiming speed (ijro etish tezligi, >1 tezlashtiradi) va timeOffset (vaqt shkalasining siljishi) parametrlarini qo‘shadi. Android da Animator vaqt shkalasida to‘g‘ridan-to‘g‘ri joylashuvni boshqarish uchun setCurrentPlayTime() dan foydalanadi. Material Design ga ko‘ra, 100 ms dan qisqa animatsiyalar animatsiya sifatida qabul qilinmaydi, 500 ms dan uzoq bo‘lganlar esa — bezovta qila boshlaydi. Interfeys animatsiyalari uchun optimal davomiylik 200–350 ms.

iOS da Timeline: CAMediaTiming va CACurrentMediaTime

iOS da animatsiya vaqt shkalasini boshqarish CAAnimation va CALayer tomonidan amalga oshiriladigan CAMediaTiming protokoli orqali amalga oshiriladi. U quyidagi xususiyatlarni ta’minlaydi: duration (soniyalarda davomiylik), beginTime (ota timeline ga nisbatan boshlanish vaqti), repeatCount (takrorlar soni), repeatDuration (umumiy takrorlash davomiyligi), autoreverses (avtomatik teskari harakat), fillMode (animatsiyadan oldin/keyin xatti-harakat), speed (ijro etish tezligi) va timeOffset (shkalada siljish).

CACurrentMediaTime() — qurilmaning oxirgi qayta ishga tushirilishidan boshlab mutlaq vaqtni soniyalarda qaytaruvchi funksiya. Bir nechta animatsiyalarni sinxronlashtirish uchun asosiy vaqt belgisi sifatida ishlatiladi: aniq kechikish bilan animatsiyalar guruhini ishga tushirish uchun beginTime = CACurrentMediaTime() + offset ni o‘rnating. CAMediaTiming shuningdek timeline ierarxiyasini qo‘llab-quvvatlaydi — ota qatlam speed xususiyati orqali barcha bola animatsiyalarini tezlashtirishi/sekinlashtirishi mumkin. UIKit da UIViewPropertyAnimator (iOS 10+) duration, delay xususiyatlari va startAnimation/pauseAnimation/stopAnimation qayta chaqiruvlari orqali vaqt shkalasini abstraksiya qiladi. SwiftUI da Animation strukturasi animatsiya spetsifikatsiyasining bir qismi sifatida duration ni ta’minlaydi, ammo vaqt shkalasini to‘g‘ridan-to‘g‘ri boshqarish yashirin — shaxsiy timeline uchun o‘z scheduleri bilan TimelineView (iOS 15+) dan foydalaning.

Android da Timeline: Animator va duration

Android da vaqt shkalasini boshqarish Animator sinfi va uning vorislarida (ValueAnimator, ObjectAnimator) markazlashtirilgan. Timeline ning asosiy xususiyatlari: duration (millisoniyalarda davomiylik), startDelay (boshlashdan oldin kechikish), repeatCount (takrorlar soni), repeatMode (RESTART yoki REVERSE). setCurrentPlayTime(long) metodi vaqt shkalasida istalgan joyga o‘tish imkonini beradi.

ValueAnimator abstraksiya darajasini qo‘shadi: duration asosida 0 dan 1 gacha qiymatlar (normalized time) yaratadi va ularni TimeInterpolator ga uzatadi. AnimatorSet bir nechta Animator ni ketma-ket (playSequentially) yoki parallel (playTogether) bajarish bilan yagona vaqt shkalasida birlashtirish imkonini beradi. Jetpack Compose da vaqt shkalasi AnimationSpec orqali boshqariladi: tween (durationMillis, delayMillis, easing), spring (dampingRatio, stiffness) va keyframes (har bir segment uchun shaxsiy easing bilan vaqt shkalasidagi nuqtalar). Compose AnimatedContent transitionSpec uchun timeline dan foydalanadi — dasturchi kontentning vaqt siljishlari bilan qanday paydo bo‘lishi/yo‘qolishini tavsiflaydi. Android Performance ga ko‘ra, animatsiya vaqt shkalasi 60fps uchun 16 ms (vsync tsikli) ga karrali bo‘lishi kerak — noto‘g‘ri davomiylik ekran yangilanish tezligi bilan mos kelmaslik tufayli kadr tushishiga olib kelishi mumkin.

Animatsiyalarning vaqt bo‘yicha kompozitsiyasi

Vaqt shkalasi ayniqsa bir nechta animatsiyalarning kompozitsiyasida muhim bo‘ladi. Uchta asosiy naqsh: kaskad — animatsiyalar siljish bilan ketma-ket ishga tushiriladi (har bir keyingisi oldingisidan offset keyin boshlanadi), parallel — barcha animatsiyalar bir vaqtning o‘zida bir xil timeline bilan ishga tushiriladi va stagger — animatsiyalar ustma-ust tushish bilan ishga tushiriladi (ikkinchisi birinchisining tugashidan oldin boshlanadi).

iOS da kaskad har bir CAAnimation ning beginTime = oldingi beginTime + oldingi duration orqali amalga oshiriladi. Stagger uchun ichki animatsiyalarda turli beginTime bilan CAAnimationGroup ishlatiladi. Android da AnimatorSet playSequentially va playTogether ni qo‘llab-quvvatlaydi; stagger har bir Animator uchun startDelay o‘rnatish orqali yaratiladi. Compose da AnimatedVisibility enter/exitTransition bilan ro‘yxat elementlarining kaskad ko‘rinishi uchun staggerChildren variantida stagger dan foydalanadi. WWDC va Google I/O 2024 da ikkala platforma timeline vizualizatsiya vositalarini taqdim etdi: Xcode Animations Inspector va Android Studio Animations Timeline — ular real vaqtda haqiqiy vaqt shkalasini va tushirilgan kadrlarni ko‘rsatadi.

Kod misollari

iOS: CAMediaTiming bilan CABasicAnimation

Shaxsiy timeline bilan animatsiya misoli: 0.3 soniya kechikish, 0.6 soniya davomiylik, autoreverse va cheksiz takrorlash. CAMediaTiming barcha vaqt parametrlarini boshqaradi.

swift
import UIKit

func breathingAnimation(layer: CALayer) {
    let animation = CABasicAnimation(keyPath: "opacity")
    animation.duration = 0.6
    animation.beginTime = CACurrentMediaTime() + 0.3
    animation.fromValue = 1.0
    animation.toValue = 0.3
    animation.autoreverses = true
    animation.repeatCount = .infinity
    animation.speed = 1.0
    animation.fillMode = .both

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

beginTime = CACurrentMediaTime() + 0.3 300 ms kechikish beradi. autoreverses = true animatsiyaning har bir tsikldan keyin teskari yo‘nalishda ketishiga sabab bo‘ladi. repeatCount = .infinity “nafas olish” effektining cheksiz tsiklini yaratadi. speed = 1.0 — normal tezlik; animatsiyani 2.0 qiymati bilan 2 marta tezlashtiring.

iOS: Shaxsiy vaqt shkalasi uchun TimelineView

SwiftUI TimelineView (iOS 15+) shaxsiy animatsiya uchun tizim timeline iga kirishni ta’minlaydi. Ko‘rinish scheduler ning har bir tigida yangilanadi.

swift
import SwiftUI

struct TimelineViewExample: View {
    var body: some View {
        TimelineView(.periodic(from: .now, by: 0.1)) { context in
            let seconds = context.date.timeIntervalSinceReferenceDate
            let phase = sin(seconds * 2 * .pi)

            Circle()
                .fill(Color.blue)
                .frame(width: 60 + 30 * phase)
                .animation(.linear(duration: 0), value: phase)
        }
    }
}

TimelineView .periodic scheduler bilan har 0.1 soniyada bir tik yaratadi. Yopilish kontekstida context.date — sinusoida fazasiga aylantiriladigan joriy vaqt. Doira o‘lchami 1 Hz chastotasi bilan pulsatsiyalanadi. TimelineView SwiftUI da Animation API siz o‘z vaqt shkalasi bilan animatsiya yaratishning yagona usuli.

Android: Shaxsiy timeline bilan ValueAnimator

To‘liq vaqt shkalasi boshqaruvi bilan ValueAnimator: kechikish, davomiylik, takrorlash. setCurrentPlayTime metodi vaqt shkalasida sakrash imkonini beradi.

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

fun View.timelineAnimation() {
    ValueAnimator.ofFloat(0f, 1f).apply {
        duration = 400
        startDelay = 200
        repeatCount = 2
        repeatMode = ValueAnimator.REVERSE
        interpolator = AccelerateDecelerateInterpolator()

        addUpdateListener { animator ->
            val progress = animator.animatedFraction
            alpha = progress
            translationX = progress * 100f
        }

        start()
    }
}

startDelay = 200 ms — boshlashdan oldin kechikish. repeatMode = REVERSE animatsiyani boshlang‘ich qiymatga qaytaradi. animatedFraction repeatMode ni hisobga olgan holda 0 dan 1 gacha taraqqiyotni beradi. addUpdateListener har bir kadrda chaqiriladi (odatda 16 ms). To‘xtatish uchun pause() / resume() dan foydalaning.

Android: Timeline kompozitsiyasi uchun AnimatorSet

AnimatorSet bir nechta animatsiyadan murakkab vaqt shkalalarini yaratish imkonini beradi. Misolda — ustma-ust tushish bilan ketma-ket bajarish (stagger).

kotlin
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.view.View

fun View.staggerAnimation() {
    val fadeIn = ObjectAnimator.ofFloat(this, "alpha", 0f, 1f).apply {
        duration = 300
    }
    val slideUp = ObjectAnimator.ofFloat(this, "translationY", 100f, 0f).apply {
        duration = 400
        startDelay = 100
    }
    val scale = ObjectAnimator.ofFloat(this, "scaleX", 0.8f, 1f).apply {
        duration = 250
        startDelay = 200
    }

    AnimatorSet().apply {
        playTogether(fadeIn, slideUp, scale)
        start()
    }
}

playTogether barcha animatsiyalarni parallel ishga tushiradi, lekin har birining o‘z startDelay i bor — bu stagger effektini yaratadi: fadeIn birinchi boshlanadi (0 ms), slideUp 100 ms keyin, scale 200 ms keyin. Natijaviy vaqt shkalasi: 0 — 100 — 200 — 600 ms. Ketma-ket bajarish uchun playSequentially dan foydalaning.

Tez-tez beriladigan savollar

Android da Animator va ValueAnimator o‘rtasidagi farq nima?

Animator — barcha animatsiyalar uchun abstrakt asosiy sinf. ValueAnimator — ob‘ektga bog‘liq bo‘lmagan holda raqamli qiymatlarni animatsiya qiladigan uning pastki sinfi. ObjectAnimator (ValueAnimator vorisi) ob‘ektning aniq xususiyatini (masalan, alpha yoki translationY) animatsiya qiladi. Timeline uchun addUpdateListener orqali qayta chaqiruv bilan universal taymer sifatida ValueAnimator dan foydalaning.

Turli qurilmalarda animatsiyalarni qanday sinxronlashtirish mumkin?

Kadrlar sonidan emas, taraqqiyotni hisoblash uchun tizim soatlaridan (iOS da CACurrentMediaTime, Android da System.nanoTime) foydalaning. Tarmoq sinxronizatsiyasi uchun offset tuzatishi bilan NTP asosidagi taymerni qo‘llang. iOS millisoniya aniqligi bilan audio-video timeline sinxronizatsiyasi uchun AVAudioSession ni qo‘llab-quvvatlaydi. Kadrlar bo‘yicha sinxronizatsiyadan saqlaning — kadr chastotasi 30 dan 120 fps gacha o‘zgaradi.

Animator da startOffset va repeatCount nima?

startOffset — animatsiya boshlanishidan oldin millisoniyalarda kechikish. Kaskad va stagger effektlari uchun ishlatiladi. repeatCount — takrorlar soni: 0 = takrorlanmaydi, ValueAnimator.INFINITE = cheksiz tsikl. repeatMode yo‘nalishni belgilaydi: RESTART (boshiga qaytarish) yoki REVERSE (teskari harakat). iOS da startOffset beginTime deb ataladi (CACurrentMediaTime bilan kombinatsiyada), repeatCount — CABasicAnimation ning xuddi shunday xususiyati.

Animatsiyaning optimal davomiyligi qancha?

Material Design interfeys animatsiyalari uchun 200–350 ms ni tavsiya qiladi. 100 ms dan qisqa animatsiyalar animatsiya sifatida qabul qilinmaydi, 500 ms dan uzoq bo‘lganlar — bezovta qiladi. Elementlarning kirish/chiqishi uchun: 200–300 ms. Ekranlar orasidagi o‘tishlar uchun: 300–400 ms. Kichik elementlar uchun qisqaroq davomiyliklar (100–200 ms), katta elementlar uchun uzoqroq (400–500 ms) foydalaning.

Animatsiya ijro etilayotganda nima uchun silkinadi?

Silkinish (jank) quyidagilar sababli yuzaga keladi: asosiy oqimdagi uzoq muddatli operatsiyalar(renderni bloklaydi), overdraw bilan murakkab View/Layer ierarxiyasi yoki timeline dan noto‘g‘ri foydalanish (davomiylik vsync ga karrali emas — 60fps uchun 16ms, 120fps uchun 8ms). Tushirilgan kadrlarni aniqlash uchun Xcode Instruments Animations yoki Android Studio Profiler dan foydalaning. Compose da murakkab chizmalarni keshlash uchun Modifier.drawWithCache ni qo‘llang.

Xulosa

  • Timeline — animatsiya jarayonini belgilaydigan duration, startDelay, repeatCount, repeatMode parametrlari bilan animatsiya vaqt modeli.
  • iOS CAMediaTiming protokoli duration, beginTime, speed, timeOffset, repeatCount, fillMode orqali vaqt shkalasini boshqaradi.
  • Android Animator va ValueAnimator to‘g‘ridan-to‘g‘ri boshqarish uchun duration, startDelay, repeatCount, repeatMode va setCurrentPlayTime ni ta’minlaydi.
  • Android da AnimatorSet va iOS da CAAnimationGroup animatsiyalarni yagona vaqt shkalasida birlashtirish imkonini beradi.
  • SwiftUI da TimelineView (iOS 15+) Animation API siz shaxsiy vaqt shkalalari uchun tizim scheduler iga kirishni ta’minlaydi.
  • iOS da CACurrentMediaTime() va Android da System.nanoTime — animatsiya sinxronizatsiyasi uchun asosiy vaqt belgilari.
  • Interfeys animatsiyalarining optimal davomiyligi — Material Design va HIG tavsiyalariga ko‘ra 200-350 ms.

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