Timeline — मूल बातें, ऐप्लिकेशन में एनिमेशन समय प्रबंधन

लेखक: IT Sectr प्रकाशित: 2026-03-02 पढ़ने का समय: 8 मिनट
Timeline (समयरेखा) एनिमेशन की एक मूलभूत अवधारणा है जो यह निर्धारित करती है कि एनिमेशन कितने समय तक चलता है, इसके चरण किस क्रम में निष्पादित होते हैं और समय प्रगति में कैसे बदलता है। मोबाइल ऐप विकास में, टाइमलाइन को duration, delay, repeat और टाइमस्टैम्प के माध्यम से प्रबंधित किया जाता है। iOS में, एनिमेशन टाइमलाइन CACurrentMediaTime और CAMediaTiming के माध्यम से कार्यान्वित की जाती है, जबकि Android में duration, startDelay और repeatCount पैरामीटर के साथ ValueAnimator और Animator का उपयोग किया जाता है। Apple Documentation के अनुसार, एनिमेशन सिंक्रनाइज़ेशन के लिए सटीक टाइमलाइन नियंत्रण अत्यंत महत्वपूर्ण है: यहां तक कि 16 ms (60fps पर एक फ्रेम) का डीसिंक्रनाइज़ेशन भी उपयोगकर्ता द्वारा झटके के रूप में महसूस किया जाता है। IT Sectr में, हमने Android में ValueAnimator और iOS में CABasicAnimation के साथ CAMediaTiming के माध्यम से टाइमलाइन उपयोग को मानकीकृत किया है — यह सभी परियोजनाओं में समान समय प्रबंधन सुनिश्चित करता है।

मुख्य बातें

  • Timeline — एनिमेशन समय प्रबंधन की अवधारणा: duration, delay, repeat, समय को प्रगति पर मैप करना।
  • CAMediaTiming — टाइमलाइन प्रबंधन के लिए iOS Core Animation प्रोटोकॉल: duration, beginTime, repeatCount, speed, timeOffset।
  • ValueAnimator — duration, startDelay, repeatCount के माध्यम से एनिमेशन टाइमलाइन के साथ काम करने के लिए केंद्रीय Android क्लास।
  • CACurrentMediaTime — सेकंड में पूर्ण समय प्राप्त करने के लिए iOS फ़ंक्शन, सिंक्रनाइज़ेशन के लिए उपयोग किया जाता है।
  • TimeInterval — iOS में एक डेटा प्रकार (Double) जो एनिमेशन गणनाओं के लिए समय अंतराल दर्शाता है।

Timeline क्या है?

Timeline एक एनिमेशन समय मॉडल है जो परिभाषित करता है कि एनिमेशन कब शुरू होता है, यह कितने समय तक चलता है और समय की प्रगति एनिमेटेड पैरामीटर में बदलाव में कैसे बदल जाती है। फ्रेम-दर-फ्रेम एनिमेशन के विपरीत, जहां प्रत्येक फ्रेम मैन्युअल रूप से सेट किया जाता है, टाइमलाइन एनिमेशन को पैरामीटर द्वारा वर्णित किया जाता है: duration — कुल अवधि, startDelay — शुरू होने से पहले देरी, repeatCount — दोहराव की संख्या, और timingFunction — गति वक्र।

टाइमलाइन सामान्यीकृत स्थान [0, 1] में काम करती है — स्थानीय समय या प्रगति। शून्य मान एनिमेशन की शुरुआत से मेल खाता है, एक पूर्णता से। एक ईज़िंग फ़ंक्शन रैखिक स्थानीय समय को वास्तविक एनिमेशन प्रगति में बदलता है। यदि repeatCount > 1 है, तो टाइमलाइन चक्रित होती है (RESTART) या उलट जाती है (REVERSE)। iOS में, CAMediaTiming speed (प्लेबैक दर, >1 तेज करता है) और timeOffset (टाइमलाइन शिफ्ट) जोड़ता है। Android में, Animator सीधे टाइमलाइन स्थिति नियंत्रण के लिए setCurrentPlayTime() का उपयोग करता है। Material Design के अनुसार, 100 ms से छोटे एनिमेशन एनिमेशन के रूप में नहीं माने जाते, जबकि 500 ms से लंबे एनिमेशन परेशान करने लगते हैं। इंटरफ़ेस एनिमेशन के लिए इष्टतम अवधि 200–350 ms है।

iOS में Timeline: CAMediaTiming और CACurrentMediaTime

iOS में, एनिमेशन टाइमलाइन प्रबंधन CAMediaTiming प्रोटोकॉल के माध्यम से किया जाता है, जो CAAnimation और CALayer द्वारा कार्यान्वित किया जाता है। यह गुण प्रदान करता है: duration (सेकंड में), beginTime (पैरेंट टाइमलाइन के सापेक्ष शुरुआत का समय), repeatCount (दोहराव की संख्या), repeatDuration (कुल दोहराव अवधि), autoreverses (स्वतः उलट), fillMode (एनिमेशन से पहले/बाद में व्यवहार), speed (प्लेबैक दर), और timeOffset (टाइमलाइन शिफ्ट)।

CACurrentMediaTime() एक फ़ंक्शन है जो डिवाइस के अंतिम रिबूट के बाद से सेकंड में पूर्ण समय लौटाता है। इसका उपयोग कई एनिमेशन को सिंक्रनाइज़ करने के लिए आधार टाइमस्टैम्प के रूप में किया जाता है: सटीक देरी के साथ एनिमेशन का एक समूह शुरू करने के लिए beginTime = CACurrentMediaTime() + offset सेट करें। CAMediaTiming टाइमलाइन पदानुक्रम का भी समर्थन करता है — एक पैरेंट लेयर speed गुण के माध्यम से सभी चाइल्ड एनिमेशन को तेज़/धीमा कर सकती है। UIKit में, UIViewPropertyAnimator (iOS 10+) duration, delay गुणों और startAnimation/pauseAnimation/stopAnimation कॉलबैक के माध्यम से टाइमलाइन को एब्सट्रैक्ट करता है। SwiftUI में, Animation संरचना duration को एनिमेशन विनिर्देश के भाग के रूप में प्रदान करती है, लेकिन सीधा टाइमलाइन नियंत्रण छिपा हुआ है — कस्टम टाइमलाइन के लिए कस्टम scheduler के साथ TimelineView (iOS 15+) का उपयोग करें।

Android में Timeline: Animator और duration

Android में, टाइमलाइन प्रबंधन Animator क्लास और इसके उपवर्गों (ValueAnimator, ObjectAnimator) में केंद्रीकृत है। मुख्य टाइमलाइन गुण हैं: duration (मिलीसेकंड में), startDelay (शुरू होने से पहले देरी), repeatCount (दोहराव की संख्या), repeatMode (RESTART या REVERSE)। setCurrentPlayTime(long) विधि टाइमलाइन पर किसी भी स्थान पर नेविगेट करने की अनुमति देती है।

ValueAnimator एक एब्स्ट्रक्शन लेयर जोड़ता है: यह duration के आधार पर 0 से 1 (सामान्यीकृत समय) तक मान उत्पन्न करता है और उन्हें TimeInterpolator को भेजता है। AnimatorSet क्रमिक (playSequentially) या समानांतर (playTogether) निष्पादन के साथ कई Animator को एक ही टाइमलाइन में संयोजित करने की अनुमति देता है। Jetpack Compose में, टाइमलाइन AnimationSpec के माध्यम से प्रबंधित की जाती है: tween (durationMillis, delayMillis, easing), spring (dampingRatio, stiffness), और keyframes (प्रत्येक खंड के लिए कस्टम easing के साथ टाइमलाइन पर बिंदु)। Compose AnimatedContent transitionSpec के लिए टाइमलाइन का उपयोग करता है — डेवलपर बताता है कि समय ऑफ़सेट के साथ सामग्री कैसे दिखाई/गायब होती है। Android Performance के अनुसार, 60fps के लिए एनिमेशन टाइमलाइन 16 ms (vsync चक्र) का गुणज होनी चाहिए — गलत अवधि डिस्प्ले रिफ्रेश दर के बेमेल होने के कारण फ्रेम ड्रॉप का कारण बन सकती है।

समय में एनिमेशन संरचना

कई एनिमेशन बनाते समय टाइमलाइन विशेष रूप से महत्वपूर्ण हो जाती है। तीन बुनियादी पैटर्न: कैस्केड — एनिमेशन ऑफ़सेट के साथ क्रमिक रूप से शुरू होते हैं (प्रत्येक अगला पिछले से ऑफ़सेट के बाद शुरू होता है), समानांतर — सभी एनिमेशन एक ही टाइमलाइन के साथ एक साथ शुरू होते हैं, और स्टैगर — एनिमेशन ओवरलैप के साथ शुरू होते हैं (दूसरा पहले के पूरा होने से पहले शुरू होता है)।

iOS में, कैस्केड प्रत्येक CAAnimation के beginTime = पिछला beginTime + पिछला duration के माध्यम से कार्यान्वित किया जाता है। स्टैगर के लिए, नेस्टेड एनिमेशन में विभिन्न beginTime मानों के साथ CAAnimationGroup का उपयोग किया जाता है। Android में, AnimatorSet playSequentially और playTogether का समर्थन करता है; प्रत्येक Animator के लिए startDelay सेट करके स्टैगर बनाया जाता है। Compose में, AnimatedVisibility enter/exitTransition के साथ सूची आइटम के कैस्केडिंग प्रदर्शन के लिए staggerChildren संस्करण में स्टैगर का उपयोग करता है। WWDC और Google I/O 2024 में, दोनों प्लेटफ़ॉर्म ने टाइमलाइन विज़ुअलाइज़ेशन टूल पेश किए: Xcode Animations Inspector और Android Studio Animations Timeline — वे वास्तविक समय में वास्तविक टाइमलाइन और ड्रॉप किए गए फ्रेम दिखाते हैं।

कोड उदाहरण

iOS: CAMediaTiming के साथ CABasicAnimation

कस्टम टाइमलाइन के साथ एनिमेशन का एक उदाहरण: 0.3 सेकंड की देरी, 0.6 सेकंड की अवधि, ऑटोरिवर्स और अनंत दोहराव। CAMediaTiming सभी समय मापदंडों को नियंत्रित करता है।

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 की देरी प्रदान करता है। autoreverses = true प्रत्येक चक्र के बाद एनिमेशन को उलटा चलाता है। repeatCount = .infinity “साँस लेने” के प्रभाव का अनंत लूप बनाता है। speed = 1.0 — सामान्य गति; 2.0 के मान से एनिमेशन को 2x तेज करें।

iOS: कस्टम टाइमलाइन के लिए TimelineView

SwiftUI TimelineView (iOS 15+) कस्टम एनिमेशन के लिए सिस्टम टाइमलाइन तक पहुंच प्रदान करता है। व्यू प्रत्येक scheduler टिक पर अपडेट होता है।

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 के साथ हर 0.1 सेकंड में टिक उत्पन्न करता है। क्लोज़र में, context.date वर्तमान समय है, जो साइन वेव चरण में परिवर्तित हो जाता है। वृत्त का आकार 1 Hz आवृत्ति पर स्पंदित होता है। TimelineView, Animation API के बिना SwiftUI में अपनी स्वयं की टाइमलाइन के साथ एनिमेशन बनाने का एकमात्र तरीका है।

Android: कस्टम टाइमलाइन के साथ ValueAnimator

पूर्ण टाइमलाइन नियंत्रण के साथ ValueAnimator: देरी, अवधि, दोहराव। setCurrentPlayTime विधि टाइमलाइन पर कूदने की अनुमति देती है।

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 — शुरू होने से पहले देरी। repeatMode = REVERSE एनिमेशन को प्रारंभिक मान पर लौटाता है। animatedFraction repeatMode को ध्यान में रखते हुए 0 से 1 तक प्रगति देता है। addUpdateListener प्रत्येक फ्रेम (सामान्यतः 16 ms) पर फायर होता है। रोकने के लिए pause() / resume() का उपयोग करें।

Android: टाइमलाइन संरचना के लिए AnimatorSet

AnimatorSet कई एनिमेशन से जटिल टाइमलाइन बनाने की अनुमति देता है। उदाहरण ओवरलैप (स्टैगर) के साथ क्रमिक निष्पादन प्रदर्शित करता है।

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 सभी एनिमेशन को समानांतर में शुरू करता है, लेकिन प्रत्येक का अपना startDelay होता है — यह स्टैगर प्रभाव पैदा करता है: fadeIn पहले शुरू होता है (0 ms), slideUp 100 ms के बाद, scale 200 ms के बाद। परिणामी टाइमलाइन: 0 — 100 — 200 — 600 ms। क्रमिक निष्पादन के लिए, playSequentially का उपयोग करें।

अक्सर पूछे जाने वाले प्रश्न

Android में Animator, ValueAnimator से कैसे अलग है?

Animator सभी एनिमेशन के लिए एक अमूर्त आधार वर्ग है। ValueAnimator इसका उपवर्ग है जो बिना किसी वस्तु से बंधे संख्यात्मक मानों को एनिमेट करता है। ObjectAnimator (ValueAnimator का उपवर्ग) किसी वस्तु की विशिष्ट संपत्ति (जैसे alpha या translationY) को एनिमेट करता है। टाइमलाइन के लिए, addUpdateListener के माध्यम से कॉलबैक के साथ ValueAnimator को सार्वभौमिक टाइमर के रूप में उपयोग करें।

विभिन्न उपकरणों पर एनिमेशन को कैसे सिंक्रनाइज़ करें?

प्रगति की गणना करने के लिए फ़्रेम संख्या के बजाय सिस्टम घड़ियों (iOS में CACurrentMediaTime, Android में System.nanoTime) का उपयोग करें। नेटवर्क सिंक्रनाइज़ेशन के लिए, ऑफ़सेट सुधार के साथ NTP-आधारित टाइमर का उपयोग करें। iOS मिलीसेकंड सटीकता के साथ ऑडियो-वीडियो टाइमलाइन सिंक्रनाइज़ेशन के लिए AVAudioSession का समर्थन करता है। फ़्रेम-आधारित सिंक्रनाइज़ेशन से बचें — फ़्रेम दरें 30 से 120 fps तक भिन्न होती हैं।

Animator में startOffset और repeatCount क्या हैं?

startOffset मिलीसेकंड में एनिमेशन शुरू होने से पहले की देरी है। कैस्केड और स्टैगर प्रभावों के लिए उपयोग किया जाता है। repeatCount दोहराव की संख्या है: 0 = कोई दोहराव नहीं, ValueAnimator.INFINITE = अनंत लूप। repeatMode दिशा निर्धारित करता है: RESTART (शुरुआत में रीसेट) या REVERSE (उलटी दिशा)। iOS में, startOffset को beginTime कहा जाता है (CACurrentMediaTime के संयोजन में), repeatCount CABasicAnimation की समान संपत्ति है।

एनिमेशन की इष्टतम अवधि क्या है?

Material Design इंटरफ़ेस एनिमेशन के लिए 200–350 ms की सिफारिश करता है। 100 ms से छोटे एनिमेशन एनिमेशन के रूप में नहीं माने जाते, जबकि 500 ms से लंबे एनिमेशन परेशान करने वाले होते हैं। तत्वों के प्रवेश/निकास के लिए: 200–300 ms। स्क्रीन के बीच संक्रमण के लिए: 300–400 ms। छोटे तत्वों के लिए छोटी अवधि (100–200 ms) और बड़े तत्वों के लिए लंबी अवधि (400–500 ms) का उपयोग करें।

प्लेबैक के दौरान एनिमेशन क्यों झटका देता है?

झटका (jank) निम्न कारणों से होता है: मुख्य थ्रेड पर लंबे समय तक चलने वाले संचालन (रेंडरिंग को अवरुद्ध करना), ओवरड्रॉ के साथ जटिल View/Layer पदानुक्रम, या गलत टाइमलाइन उपयोग (अवधि vsync का गुणज नहीं — 60fps के लिए 16ms, 120fps के लिए 8ms)। ड्रॉप किए गए फ्रेम का पता लगाने के लिए Xcode Instruments Animations या Android Studio Profiler का उपयोग करें। Compose में, जटिल ड्रॉइंग को कैश करने के लिए Modifier.drawWithCache का उपयोग करें।

सारांश

  • Timeline duration, startDelay, repeatCount, repeatMode पैरामीटर वाला एक एनिमेशन समय मॉडल है जो एनिमेशन प्रवाह को परिभाषित करता है।
  • iOS CAMediaTiming प्रोटोकॉल duration, beginTime, speed, timeOffset, repeatCount, fillMode के माध्यम से टाइमलाइन प्रबंधित करता है।
  • Android Animator और ValueAnimator सीधे नियंत्रण के लिए duration, startDelay, repeatCount, repeatMode और setCurrentPlayTime प्रदान करते हैं।
  • Android में AnimatorSet और iOS में CAAnimationGroup एनिमेशन को एक ही टाइमलाइन में संयोजित करने की अनुमति देते हैं।
  • SwiftUI में TimelineView (iOS 15+) Animation API के बिना कस्टम टाइमलाइन के लिए सिस्टम scheduler तक पहुंच प्रदान करता है।
  • iOS में CACurrentMediaTime() और Android में System.nanoTime एनिमेशन सिंक्रनाइज़ेशन के लिए आधार टाइमस्टैम्प हैं।
  • Material Design और HIG अनुशंसाओं के अनुसार इंटरफ़ेस एनिमेशन के लिए इष्टतम अवधि 200-350 ms है।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें