انیمیشن اپلیکیشنهای موبایل آنها را زنده و پاسخگو میکند، توجه کاربر را هدایت کرده و درک رابط را بهبود میبخشد. در این مقاله انواع اصلی انیمیشنها در iOS و Android را بررسی خواهیم کرد: Property Animation، View Animation، UIKit Dynamics، Core Animation، Lottie، Rive، Spring Animation، Hero Animation و Shared Element Transition. این مطالب به توسعهدهندگان مبتدی کمک میکند تا بفهمند برای یک کار خاص چه ابزارها و کتابخانههایی را انتخاب کنند. جزئیات بیشتر — در مستندات رسمی Android Animations.
نکات اصلی
Android دو سیستم اصلی انیمیشن ارائه میدهد: View Animation (قدیمی) و Property Animation (مدرن). View Animation (یا Tween Animation) فقط با نمایش بصری کار میکند — نمایش View را تغییر میدهد اما ویژگیهای واقعی آن را تغییر نمیدهد (به عنوان مثال، مختصات کلیک در جای خود باقی میمانند). Property Animation که در Android 3.0 معرفی شد، ویژگیهای واقعی شیء را از طریق Animator — ValueAnimator، ObjectAnimator یا AnimatorSet تغییر میدهد.
ObjectAnimator محبوبترین کلاس Property Animation است. یک ویژگی خاص شیء (به عنوان مثال، translationX، alpha، scaleY) را در مدت زمان مشخص با Interpolator معین انیمیشن میکند.
ObjectAnimator.ofFloat(myView, "translationX", 0f, 300f).apply {
duration = 500
interpolator = FastOutSlowInInterpolator()
startDelay = 200
}.start()
ValueAnimator به یک شیء خاص متصل نیست — مقادیری تولید میکند که میتوان برای هر ویژگی یا منطق سفارشی استفاده کرد.
View Animation در فایلهای XML res/anim/ توصیف میشود. چهار نوع پشتیبانی میشود: scale، translate، rotate، alpha. نقص این است که انیمیشن پارامترهای واقعی View را تغییر نمیدهد. برای جلوههای ساده (چشمک زدن، چرخش) View Animation هنوز قابل استفاده است، اما برای پروژههای جدید Property Animation توصیه میشود.
Jetpack Compose یک API انیمیشن مدرن ارائه میدهد: animateAsState، Animatable، AnimatedVisibility و AnimatedContent. انیمیشن در Compose واکنشگرا است: وقتی وضعیت تغییر میکند، انیمیشن به طور خودکار شروع میشود.
var expanded = remember { mutableStateOf(false) }
val size = animateAsState(
if (expanded) 200f else 50f
)
Box(
modifier = Modifier
.size(size.value, size.value)
.clickable { expanded = !expanded }
.background(Color.Blue)
)
iOS یک پشته انیمیشن قدرتمند مبتنی بر Core Animation — یک فریمورک سطح پایین که با CALayer کار میکند — ارائه میدهد. UIKit بر روی Core Animation با روشهای راحت UIView.animate و UIViewPropertyAnimator ساخته شده است.
UIView.animate سادهترین راه برای انیمیشن در iOS است. اجازه میدهد frame، alpha، transform، backgroundColor و سایر ویژگیهای UIView را انیمیشن کنید.
UIView.animate(
withDuration: 0.5,
delay: 0.2,
usingSpringWithDamping: 0.6,
initialSpringVelocity: 1.0,
options: [.curveEaseInOut]
) {
myView.frame.origin.x += 300
myView.alpha = 0.5
}
UIKit Dynamics — یک فریمورک برای انیمیشن فیزیکی: گرانش، برخوردها، فنرها، نیروهای جاذبه. امکان ایجاد رفتار واقعگرایانه اشیاء بدون محاسبه دستی فیزیک را فراهم میکند. برای انتقالهای سفارشی، منوهای انیمیشنی و عناصر بازی استفاده میشود.
Core Animation (CAAnimation، CABasicAnimation، CAKeyframeAnimation) — یک API سطح پایین برای انیمیشن CALayer. از تبدیلهای سهبعدی، انیمیشن مسیر (keyframe)، ماسکگذاری و ترکیب پشتیبانی میکند. SwiftUI از Core Animation در پشت صحنه از طریق اصلاحکنندههای animation و withAnimation استفاده میکند.
let animation = CABasicAnimation(keyPath: "transform.rotation.z")
animation.fromValue = 0
animation.toValue = CGFloat.pi * 2
animation.duration = 1.0
animation.repeatCount = .infinity
myLayer.add(animation, forKey: "rotation")
برای اکثر پروژههای iOS از SwiftUI با انیمیشن داخلی آن استفاده میشود. به عنوان مثال، withAnimation تغییرات وضعیت را در یک زمینه انیمیشنی میپیچد.
انیمیشنهای پیچیده (شخصیتها، انتقالها، بارگذارها) پیادهسازی با کد دشوار است. Lottie و Rive این مشکل را با اجازه دادن به طراحان برای ایجاد انیمیشن در ویرایشگرهای بصری و توسعهدهندگان برای جاسازی آن در برنامه به عنوان یک جزء آماده حل میکنند.
Lottie — کتابخانهای از Airbnb (اکنون LottieFiles) که انیمیشنهای Adobe After Effects صادر شده در قالب JSON را رندر میکند. در Android، iOS، Flutter، React Native و Web پشتیبانی میشود. انیمیشنهای Lottie برداری هستند، بدون افت کیفیت مقیاس میشوند و میتوان آنها را به صورت برنامهنویسی سفارشی کرد (سرعت، پیشرفت، رنگها).
// Android import com.airbnb.lottie.LottieAnimationView val lottieView = findViewById<LottieAnimationView>(R.id.lottieView) lottieView.setAnimation(R.raw.loading_animation) lottieView.playAnimation()
Rive (قبلاً 2Dimensions) — ابزاری پیشرفتهتر برای انیمیشن برداری. برخلاف Lottie، Rive از انیمیشن تعاملی پشتیبانی میکند: حالتها، محرکها، انتقالها. انیمیشن در Rive Editor ایجاد میشود و در برنامه از طریق State Machine کنترل میشود. Rive برای رابطهای بازی، آیکونهای انیمیشنی و انتقالهای پیچیده با بازخورد مناسب است.
در IT Sectr ما از Lottie برای انیمیشنهای تزئینی (بارگذارها، عملیات موفق، حالتهای خالی) و از Rive برای عناصر تعاملی صفحههای راهاندازی استفاده میکنیم. این کار زمان توسعه انیمیشن را تا ۶۰٪ در مقایسه با پیادهسازی دستی در UIKit یا Canvas کاهش میدهد.
Shared Element Transition — انیمیشنی که در آن یک عنصر (تصویر، متن، کارت) هنگام انتقال بین صفحهها به آرامی حرکت میکند و تغییر شکل میدهد. این توهم تداوم را ایجاد میکند: کاربر به یک صفحه جدید «نمیرود»، بلکه در عنصر «سقوط میکند».
در Android انتقال از طریق ActivityOptionsCompat و ویژگیهای transitionName پیادهسازی میشود. FragmentTransaction از addSharedElement برای انتقالهای داخل Activity پشتیبانی میکند. Compose از SharedTransitionLayout با SharedContentState استفاده میکند.
iOS انتقال Hero داخلی ندارد، اما کتابخانه Hero (توسط Luke Zhao) این الگو را در UIKit پیادهسازی میکند. فقط به عناصر در هر دو صفحه یک id اختصاص دهید — Hero به طور خودکار یک انتقال روان ایجاد میکند. در SwiftUI، انیمیشن انتقال از طریق NavigationStack و matchedGeometryEffect داخلی است.
Flutter یک ویجت Hero داخلی با پارامتر tag دارد. وقتی دو صفحه حاوی Hero با tag یکسان هستند، Flutter به طور خودکار انتقال بین آنها را انیمیشن میکند. این یکی از سادهترین راهها برای پیادهسازی انیمیشن پیچیده در یک اپلیکیشن موبایل است.
Hero( tag: 'profile_avatar', child: CircleAvatar( backgroundImage: AssetImage('avatar.jpg'), radius: 50, ), )
برای اینکه انیمیشن طبیعی به نظر برسد، از منحنیهای سرعت استفاده میشود — Interpolator در Android و Easing در iOS. آنها تعیین میکنند که سرعت انیمیشن از ابتدا تا انتها چگونه تغییر میکند.
Android از چندین Interpolator داخلی پشتیبانی میکند: LinearInterpolator (یکنواخت)، AccelerateDecelerateInterpolator (کند-سریع-کند)، FastOutSlowInInterpolator (Material Design)، OvershootInterpolator (با بیشروی) و BounceInterpolator (با جهش). Interpolator سفارشی را میتوان از طریق XML یا کلاس TimeInterpolator ایجاد کرد.
| Interpolator | رفتار | استفاده |
|---|---|---|
| LinearInterpolator | سرعت ثابت | نشانگرهای بارگذاری، چرخشهای بینهایت |
| FastOutSlowInInterpolator | شروع سریع، پایان نرم | Material Design، ظاهر شدن کارتها |
| OvershootInterpolator | هدف را رد کرده و برمیگردد | عناصر تأکیدی، دکمهها |
| BounceInterpolator | جهش در پایان | فهرستها، کشیدن برای بهروزرسانی |
Spring Animation (انیمیشن فنری) فیزیک فنر را با پارامترهای damping (میرایی) و stiffness (سفتی) مدل میکند. میرایی ۰ — نوسانات بینهایت، ۱ — بدون نوسان. سفتی سرعت بازگشت را تعیین میکند. Spring Animation در iOS (UIViewPropertyAnimator با UISpringTimingParameters)، Android (SpringAnimation از physics2) و SwiftUI (spring()) در دسترس است.
مستندات Spring Animation در Android شامل مثالهای پیکربندی دقیق است.
Timeline (جدول زمانی) — رویکردی که در آن انیمیشن به فریمهایی در طول زمان تقسیم میشود. برای توالیهای پیچیده استفاده میشود که در آن AnimationSet یا انیمیشن گروهی به اندازه کافی انعطافپذیر نیستند. Android از AnimatorSet، iOS از CAAnimationGroup، Flutter از Interval در AnimationController پشتیبانی میکند.
Часто задаваемые вопросы
View Animation (Android) فقط نمایش بصری View را بدون تغییر ویژگیهای واقعی تغییر میدهد (موقعیت کلیک تغییر نمیکند). Property Animation ویژگیهای واقعی شیء را تغییر میدهد و رفتار انعطافپذیرتر و قابل پیشبینیتری ارائه میدهد. برای پروژههای جدید همیشه از Property Animation استفاده کنید.
Hero Animation انیمیشنی است که در آن یک عنصر هنگام انتقال بین صفحهها به آرامی حرکت کرده و تغییر شکل میدهد و توهم تداوم را ایجاد میکند. از طریق Hero (Flutter)، SharedElementTransition (Android) یا matchedGeometryEffect (SwiftUI) پیادهسازی میشود.
Lottie و Rive کتابخانههایی برای رندر انیمیشن برداری در زمان اجرا هستند. طراح انیمیشن را در After Effects (Lottie) یا Rive Editor ایجاد میکند، به JSON صادر میکند و توسعهدهنده بدون نوشتن دستی کد انیمیشن آن را جاسازی میکند.
Spring Animation فیزیک فنر را مدل میکند: انیمیشن دارای میرایی طبیعی و «جهش» است. SwiftUI و Jetpack Compose از انیمیشنهای spring به صورت بومی پشتیبانی میکنند و رابط را زندهتر و پاسخگوتر میکنند.
انتخاب به زمینه بستگی دارد: FastOutSlowIn — برای ظاهر شدن عناصر، Overshoot — برای تأکید، Linear — برای نشانگرهای بارگذاری، Bounce — برای فهرستها. Material Design منحنیهای استاندارد را توصیه میکند: standard easing، deceleration easing و acceleration easing.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.