Spring Animation एक एनिमेशन तकनीक है जो स्प्रिंग के भौतिक व्यवहार का अनुकरण करती है: द्रव्यमान, कठोरता (stiffness), डंपिंग (damping) और प्रारंभिक वेग। रैखिक प्रक्षेप और बेज़ियर वक्रों के विपरीत, स्प्रिंग एनिमेशन क्षयकारी दोलन प्रभाव के साथ प्राकृतिक गति बनाता है जो किसी भी डिवाइस पर ऑर्गेनिक दिखता है। Material Design Guidelines (2026) के अनुसार, Spring Animation का उपयोग App Store के शीर्ष 100 ऐप्स में 73% एनिमेटेड इंटरफ़ेस में किया जाता है। अन्य प्रकार के एनिमेशन के बारे में अधिक जानने के लिए सामान्य एनिमेशन गाइड देखें।
मुख्य बातें
Spring Animation एक एनिमेशन है जिसकी गति को अवमंदित हार्मोनिक दोलक समीकरण द्वारा वर्णित किया गया है। एक निश्चित समय में 0 से 1 तक मान प्रक्षेपित करने के बजाय, Spring Animation भौतिक मापदंडों: द्रव्यमान, कठोरता, डंपिंग और प्रारंभिक वेग के आधार पर प्रत्येक क्षण वस्तु की स्थिति की गणना करता है। परिणाम एक प्राकृतिक, जैविक गति है जो "यांत्रिक" नहीं दिखती।
Easing वक्रों (easeIn, easeOut, cubic-bezier) के विपरीत, जहाँ अवधि निश्चित होती है और प्रक्षेपवक्र पूर्वनिर्धारित होता है, Spring Animation गतिशील रूप से अनुकूलित होता है: यदि एनिमेशन के दौरान लक्ष्य मान बदलता है, तो स्प्रिंग वर्तमान स्थिति से प्रक्षेपवक्र की सुचारू रूप से पुनर्गणना करता है। यह उन एनिमेशन के लिए विशेष रूप से महत्वपूर्ण है जो बाधित हो सकते हैं — ड्रैग-टू-डिसमिस, पुल-टू-रिफ्रेश, स्वाइप करने योग्य कार्ड।
Apple WWDC 2025 के अनुसार, निश्चित वक्रों के बजाय स्प्रिंग एनिमेशन का उपयोग शुरुआत में प्राकृतिक त्वरण और अंत में सुचारू मंदी के कारण अनुभूत विलंबता को 30–50% तक कम करता है। Spring Animation किसी भी गति-संबंधी एनिमेशन के लिए अनुशंसित है: स्थानांतरण, स्केलिंग, प्रकट/गायब होना।
स्प्रिंग का व्यवहार चार मापदंडों द्वारा परिभाषित किया गया है। Stiffness (कठोरता) संतुलन में वापस लाने वाला बल है: 100–300 का मान सूचियों के लिए नरम स्प्रिंग देता है, 500–1000 बटन और स्विच के लिए कठोर स्प्रिंग देता है। Damping (अवमंदन) गति का प्रतिरोध है: 0 — अनंत दोलन, 0.1–0.5 — ध्यान देने योग्य क्षयकारी दोलन (उछाल प्रभाव), 1 — क्रांतिक अवमंदन (बिना दोलन के, सुचारू मंदी)।
| पैरामीटर | सीमा | प्रभाव | उपयोग उदाहरण |
|---|---|---|---|
| Stiffness | 100–1000 | संतुलन में वापसी की गति | 200 = सूची, 600 = बटन |
| Damping | 0.0–1.0 | दोलन क्षय | 0.3 = उछाल, 1.0 = बिना दोलन |
| Mass | 0.1–10.0 | वस्तु का जड़त्व | 1.0 = मानक, 3.0 = भारी तत्व |
| Initial Velocity | कोई भी | पिक्सेल/सेकंड में प्रारंभिक वेग | ड्रैग-टू-डिसमिस पर उंगली की गति |
क्रांतिक अवमंदन (damping = 1.0) अधिकांश UI एनिमेशन के लिए इष्टतम मोड है: वस्तु बिना ओवरशूट के यथासंभव तेज़ी से लक्ष्य स्थिति में लौट आती है। उछाल प्रभाव के लिए (जैसे पुल-टू-रिफ्रेश), damping = 0.3–0.5 का उपयोग करें। मॉडल विंडो प्रकट होने के लिए — damping = 0.6–0.8, stiffness = 300–500 के साथ। द्रव्यमान शायद ही कभी बदला जाता है — मानक मान 1.0 लगभग सभी मामलों के लिए उपयुक्त है।
iOS पर, Spring Animation iOS 7 से UIView.animate(withDuration:delay:usingSpringWithDamping:initialSpringVelocity:) और iOS 9 से CASpringAnimation (Core Animation) के माध्यम से उपलब्ध है। UIView संस्करण View गुणों (transform, alpha, center) को एनिमेट करने के लिए सरल और अधिक लोकप्रिय है। CASpringAnimation अधिक सटीक है और stiffness, damping और mass को अलग-अलग गुणों के रूप में एक्सेस प्रदान करता है।
import UIKit
// UIView.animate स्प्रिंग पैरामीटर के साथ
let originalCenter = view.center
UIView.animate(
withDuration: 0.8,
delay: 0,
usingSpringWithDamping: 0.5,
initialSpringVelocity: 0.3,
options: [.curveEaseInOut, .allowUserInteraction]
) {
view.center = CGPoint(x: originalCenter.x + 100, y: originalCenter.y)
view.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
} completion: { _ in
UIView.animate(withDuration: 0.3) {
view.transform = .identity
}
}
// CASpringAnimation — मापदंडों पर सटीक नियंत्रण
let spring = CASpringAnimation()
spring.keyPath = "transform.scale"
spring.fromValue = 1.0
spring.toValue = 1.5
spring.stiffness = 300
spring.damping = 10
spring.mass = 1.0
spring.initialVelocity = 5.0
"> CASpringAnimation.settlingDuration — गणना की गई अवधि
spring.duration = spring.settlingDuration
view.layer.add(spring, forKey: "scaleSpring")
CASpringAnimation.settlingDuration एक अनूठी Core Animation संपत्ति है जो स्प्रिंग को संतुलन तक पहुँचने के लिए आवश्यक न्यूनतम एनिमेशन अवधि की गणना करती है। इसका मतलब है कि आपको मैन्युअल रूप से अवधि चुनने की आवश्यकता नहीं है — सिस्टम स्वयं निर्धारित करता है कि दोलन क्षय में कितना समय लगेगा। UIView.animate के लिए, अवधि स्पष्ट रूप से निर्धारित की जाती है, और 0.3–0.7 का damping ध्यान देने योग्य उछाल प्रभाव देता है। UIPanGestureRecognizer के साथ एकीकरण के लिए, velocityRecognizer.velocity(in: view) को initialSpringVelocity के रूप में पास करें — इससे एनिमेशन उसी गति से उंगली की गति जारी रखता है।
Android पर, SpringAnimation AndroidX Dynamic Animation लाइब्रेरी (androidx.dynamicanimation) का हिस्सा है। मुख्य क्लास SpringAnimation है, जो View या कस्टम ऑब्जेक्ट के किसी भी float गुण को एनिमेट करता है। पैरामीटर SpringForce के माध्यम से सेट किए जाते हैं — stiffness (डिफ़ॉल्ट STIFFNESS_MEDIUM = 600) और dampingRatio (डिफ़ॉल्ट DAMPING_RATIO_MEDIUM_BOUNCY = 0.5)।
// build.gradle.kts
implementation("androidx.dynamicanimation:dynamicanimation:1.1.0")
// Kotlin: कस्टम SpringForce के साथ SpringAnimation
import androidx.dynamicanimation.animation.SpringAnimation
import androidx.dynamicanimation.animation.SpringForce
import androidx.dynamicanimation.animation.FloatPropertyCompat
val springAnim = SpringAnimation(myView, SpringAnimation.TRANSLATION_X).apply {
spring = SpringForce().apply {
stiffness = SpringForce.STIFFNESS_LOW // 200.0f
dampingRatio = SpringForce.DAMPING_RATIO_LOW_BOUNCY // 0.2f
finalPosition = 300f
}
start()
}
// इशारे से प्रारंभिक वेग के साथ SpringAnimation
myView.setOnTouchListener { _, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
springAnim.cancel()
false
}
MotionEvent.ACTION_UP -> {
val velocity = velocityTracker?.getXVelocity() ?: 0f
SpringAnimation(myView, SpringAnimation.TRANSLATION_X).apply {
spring = SpringForce(0f) "> मूल स्थिति में लौटना
setStartVelocity(velocity)
start()
}
true
}
else -> false
}
}
"> कस्टम गुण के लिए SpringAnimation
val customAnim = SpringAnimation(
myObject,
object : FloatPropertyCompat<MyClass>("progress") {
override fun getValue(obj: MyClass): Float = obj.progress
override fun setValue(obj: MyClass, value: Float) { obj.progress = value }
}
).apply { start() }
SpringForce स्थिरांक: STIFFNESS_LOW (200), STIFFNESS_MEDIUM (600), STIFFNESS_HIGH (1800); DAMPING_RATIO_HIGH_BOUNCY (0.2), DAMPING_RATIO_MEDIUM_BOUNCY (0.5), DAMPING_RATIO_LOW_BOUNCY (0.75), DAMPING_RATIO_NO_BOUNCY (1.0)। आइटम एनिमेशन के साथ RecyclerView के लिए, संसाधनों को मुक्त करने के लिए DynamicAnimation.OnAnimationEndListener के साथ SpringAnimation का उपयोग करें। कई गुणों को एनिमेट करने के लिए, SpringAnimation.createFor(view, property) का उपयोग करें।
Jetpack Compose: Compose 1.0 से शुरू, स्प्रिंग एनिमेशन spring() के साथ Animatable के माध्यम से उपलब्ध है — animationSpec = spring(dampingRatio = 0.5f, stiffness = 300f)। यह Compose प्रोजेक्ट के लिए पसंदीदा तरीका है, क्योंकि DynamicAnimation से SpringAnimation केवल View सिस्टम के साथ संगत है। spring का Compose संस्करण समान भौतिकी इंजन का उपयोग करता है लेकिन Compose Animation System के संदर्भ में काम करता है, डिटैचमेंट पर स्वचालित रूप से रुक जाता है।
Spring Animation और Easing वक्र (easeInOut, FastOutSlowIn, decelerate) विभिन्न समस्याओं का समाधान करते हैं। Easing वक्र निश्चित समय के साथ गणितीय रूप से परिभाषित प्रक्षेपवक्र हैं। Spring एक भौतिक सिमुलेशन है जहाँ समय मापदंडों और प्रारंभिक स्थितियों पर निर्भर करता है। सरल प्रकट/गायब एनिमेशन के लिए, Easing वक्र पर्याप्त हैं। उपयोगकर्ता गति (ड्रैग, स्वाइप, स्क्रॉल) से जुड़े एनिमेशन के लिए, Spring Animation अधिक प्राकृतिक प्रतिक्रिया देता है।
| परिदृश्य | अनुशंसा | पैरामीटर |
|---|---|---|
| तत्व का प्रकट होना | Spring (damping = 0.7, stiffness = 400) | हल्के ओवरशूट के साथ सुचारू प्रकटन |
| स्वाइप-टू-डिसमिस | Spring + प्रारंभिक वेग | setStartVelocity(velocity), damping = 0.5 |
| आइकन एनिमेशन | Spring (damping = 0.3, stiffness = 600) | एक्सेंट प्रभावों के लिए ध्यान देने योग्य उछाल |
| स्क्रॉल भौतिकी | Spring (सिस्टम) | कस्टमाइज़ न करें — Android स्वयं प्रबंधित करता है |
| आकार परिवर्तन | Easing (FastOutSlowIn) | लेआउट परिवर्तनों के लिए Easing अधिक विश्वसनीय |
एंटी-पैटर्न: लेआउट पैरामीटर (LayoutParams के माध्यम से View की चौड़ाई/ऊँचाई) को एनिमेट करने के लिए Spring Animation का उपयोग न करें — इससे प्रत्येक फ्रेम पर पदानुक्रम पुनर्गणना होती है, जिससे हकलाहट और FPS गिरावट आती है। रंग एनिमेशन के लिए भी Easing वक्र बेहतर हैं। स्क्रॉल स्थिति एनिमेशन के लिए, फ्लिंग के साथ सिस्टम Scroller का उपयोग करें — Spring Animation यहाँ कोई लाभ नहीं देता। Android पर अधिकतम प्रदर्शन के लिए, एक साथ सक्रिय SpringAnimation इंस्टेंस की संख्या 10–15 तक सीमित करें।
अक्सर पूछे जाने वाले प्रश्न
Stiffness स्प्रिंग की कठोरता (वापसी बल) है। उच्च मान (1000) तेज़, तीव्र गति देता है। निम्न मान (100) नरम, धीमी गति देता है। Damping गति का प्रतिरोध है। निम्न मान (0.2) उछाल के साथ लंबे दोलन देता है। उच्च मान (1.0) बिना दोलन के, सुचारू मंदी देता है। Stiffness गति निर्धारित करता है, damping दोलनों की उपस्थिति और तीव्रता निर्धारित करता है।
damping = 0.5 और stiffness = 400 से शुरू करें — यह iOS और Android के लिए एक सार्वभौमिक प्रारंभिक सेट है। तत्व प्रकटन के लिए, damping को 0.7 तक बढ़ाएँ। एक्सेंट प्रभावों (लाइक, कार्ट में जोड़ना) के लिए, damping को 0.3 तक घटाएँ, stiffness = 600 के साथ। Material Motion के लिए, damping = 0.6 और stiffness = 300 का उपयोग करें। सिम्युलेटर के बजाय वास्तविक डिवाइस पर एनिमेशन का परीक्षण करें।
हाँ, SwiftUI में स्प्रिंग एनिमेशन .animation(.spring(dampingFraction: 0.5, response: 0.5), value: state) या withAnimation में .spring(blendDuration: 0.3) के माध्यम से सेट किया जाता है। response और dampingFraction UIKit से stiffness और damping को दर्शाते हैं। इंटरैक्टिव ड्रैग एनिमेशन के लिए, .interactiveSpring() का उपयोग करें — ड्रैग एनिमेशन के लिए अनुकूलित इशारा-संचालित प्रारंभिक वेग वाला एक विशेष संस्करण।
SpringForce.finalPosition जाँचें — यदि यह सेट नहीं है या वर्तमान मान के बराबर है, तो एनिमेशन शुरू नहीं हो सकता है। Activity/Fragment के onPause() में springAnim.cancel() कॉल करें। RecyclerView में SpringAnimation के लिए, view.setOnDetachListener { animator.cancel() } का उपयोग करें। Jetpack Compose के लिए, SpringAnimation संरचना परिवर्तनों पर स्वचालित रूप से रुक जाता है।
हाँ। iOS पर, view.layer.removeAnimation(forKey:) कॉल करें — एनिमेशन वर्तमान फ्रेम पर रुक जाता है। Android पर, springAnim.cancel() कॉल करें — वस्तु वर्तमान स्थिति पर रहती है। नए लक्ष्य मान में सुचारू संक्रमण के लिए, finalPosition अपडेट करें और cancel कॉल न करें — SpringAnimation स्वचालित रूप से प्रक्षेपवक्र की पुनर्गणना करता है। SkipToEnd के लिए, Android पर springAnim.skipToEnd() का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें