CAAnimation হল Core Animation-এর একটি অ্যাবস্ট্র্যাক্ট বেস ক্লাস যা সকল ধরনের অ্যানিমেশনের জন্য সাধারণ ইন্টারফেস নির্ধারণ করে: CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, CATransition। নিবন্ধটি ক্লাস হায়ারার্কি, মূল বৈশিষ্ট্য, অ্যানিমেশন গ্রুপিং এবং Swift-এ ব্যবহারিক উদাহরণ ব্যাখ্যা করে।
মূল পয়েন্ট
CAAnimation হল Core Animation-এর একটি অ্যাবস্ট্র্যাক্ট ক্লাস যা সকল অ্যানিমেশনের জন্য সাধারণ ইন্টারফেস নির্ধারণ করে। এটি CAMediaTiming প্রোটোকল (সময়কাল, পুনরাবৃত্তি, অটোরিভার্স) এবং CAMediaTimingFillMode (অ্যানিমেশনের আগে/পরে আচরণ) বাস্তবায়ন করে। CAAnimation সরাসরি ইনস্ট্যানশিয়েট করা যায় না — এর উপশ্রেণীগুলির একটি ব্যবহার করুন: CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, CATransition বা CAAnimation (animationForKeyPath-এর মাধ্যমে)।
প্রতিটি CAAnimation add(_:forKey:) পদ্ধতির মাধ্যমে CALayer-এ যোগ করা হয়। forKey প্যারামিটারটি লেয়ারে অ্যানিমেশনের একটি অনন্য শনাক্তকারী। একটি keyPath-এ শুধুমাত্র একটি সক্রিয় অ্যানিমেশন থাকতে পারে। একটি অ্যানিমেশন প্রতিস্থাপন করতে, নতুন যোগ করার আগে removeAnimation(forKey:) ব্যবহার করুন।
Apple-এর মতে, CAAnimation হল লেয়ারের একটি "অস্থায়ী" পরিবর্তন। অ্যানিমেশন সম্পূর্ণ হওয়ার পর, উপস্থাপনা লেয়ার মডেল লেয়ারের মানগুলিতে ফিরে আসে যদি fillMode এবং isRemovedOnCompletion সেট না করা থাকে।
Core Animation চারটি প্রধান CAAnimation উপশ্রেণী প্রদান করে, প্রতিটি তার নিজস্ব অ্যানিমেশন পরিস্থিতির জন্য। হায়ারার্কি বুঝতে পারলে কাজের জন্য সঠিক ধরন নির্বাচন করতে সাহায্য করে।
| ক্লাস | উদ্দেশ্য | মূল বৈশিষ্ট্য |
|---|---|---|
| CABasicAnimation | একটি বৈশিষ্ট্যকে A থেকে B পর্যন্ত অ্যানিমেট করে | fromValue, toValue, byValue, keyPath |
| CAKeyframeAnimation | একাধিক কীফ্রেম জুড়ে অ্যানিমেশন | values, keyTimes, path, calculationMode |
| CAAnimationGroup | একাধিক অ্যানিমেশন গ্রুপ করে | animations অ্যারে, একক duration |
| CATransition | লেয়ার অবস্থার মধ্যে ট্রানজিশন | type (fade/push/moveIn/reveal), subtype, startProgress |
CABasicAnimation হল সবচেয়ে সহজ এবং জনপ্রিয় উপশ্রেণী। CAKeyframeAnimation জটিল ট্রাজেক্টরির জন্য ব্যবহৃত হয় (যেমন, Bezier বক্ররেখা বরাবর গতি)। CAAnimationGroup একাধিক অ্যানিমেশন সমান্তরালে চালায়। CATransition হল ছবি বা কন্টেন্ট অবস্থার মধ্যে একটি প্রস্তুত ট্রানজিশন।
CAMediaTiming প্রোটোকল CAAnimation-এর একটি মৌলিক অংশ। এটি মৌলিক সময়ের বৈশিষ্ট্যগুলি নির্ধারণ করে: duration, repeatCount, repeatDuration, autoreverses, beginTime (পিতামাতার সাপেক্ষে শুরু সময়), timeOffset (একটি চক্রের মধ্যে অফসেট), speed (প্লেব্যাক হার)।
fillMode বৈশিষ্ট্য (CAMediaTimingFillMode) অ্যানিমেশনের আগে (backwards) এবং পরে (forwards) লেয়ার প্রদর্শন নির্ধারণ করে। মান: removed (ডিফল্ট — মডেল লেয়ারে ফিরে যায়), forwards (চূড়ান্ত অবস্থায় থাকে), backwards (শুরুর আগে প্রাথমিক অবস্থা দেখায়), both (উভয় আচরণ একত্রিত করে)। fillMode শুধুমাত্র তখন কাজ করে যখন isRemovedOnCompletion = false।
CAAnimation CAMediaTiming থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং এটি একটি পিতামাতা অ্যানিমেশনে (CAAnimationGroup) নেস্ট করা যেতে পারে। এই ক্ষেত্রে, beginTime পিতামাতার শুরুর সাপেক্ষে গণনা করা হয়, এবং duration পিতামাতার সময়কাল দ্বারা সীমিত হয়। Speed = 2.0 অ্যানিমেশনের গতি দ্বিগুণ করে।
CAAnimationGroup একাধিক CAAnimation ইনস্ট্যান্সকে একটি গ্রুপে একত্রিত করে। সমস্ত চাইল্ড অ্যানিমেশন সমান্তরালে শুরু হয় যদি না প্রতিটির জন্য beginTime সেট করা থাকে। গ্রুপের নিজস্ব duration থাকে, যা চাইল্ড অ্যানিমেশনের সর্বোচ্চ সময়কাল সীমিত করে। গ্রুপের timingFunction ডিফল্ট মান হিসেবে ব্যবহৃত হয় যদি চাইল্ড অ্যানিমেশন নিজস্ব সেট না করে।
CAKeyframeAnimation একটি বৈশিষ্ট্যকে একাধিক কীফ্রেম জুড়ে অ্যানিমেট করে, যা values-এর অ্যারে দ্বারা নির্ধারিত হয়। keyTimes প্যারামিটার (0 থেকে 1 পর্যন্ত NSNumber-এর অ্যারে) প্রতিটি ফ্রেমের জন্য সময় টিকিট নির্ধারণ করে। calculationMode ইন্টারপোলেশন নির্দিষ্ট করে: linear, discrete (কোনো ইন্টারপোলেশন নেই), paced (অভিন্ন গতি), cubic (স্প্লাইন), cubicPaced।
import QuartzCore
// CAAnimationGroup — অ্যানিমেশন সংমিশ্রণ
func complexLayerAnimation(_ layer: CALayer) {
let fade = CABasicAnimation(keyPath: "opacity")
fade.fromValue = 1.0
fade.toValue = 0.3
let scale = CABasicAnimation(keyPath: "transform.scale")
scale.fromValue = 1.0
scale.toValue = 1.5
let rotate = CABasicAnimation(keyPath: "transform.rotation.z")
rotate.fromValue = 0
rotate.toValue = Double.pi * 2
let group = CAAnimationGroup()
group.animations = [fade, scale, rotate]
group.duration = 2.0
group.repeatCount = .infinity
group.autoreverses = true
layer.add(group, forKey: "pulse")
}
// CAKeyframeAnimation — ট্রাজেক্টরি গতি
func animateAlongPath(_ layer: CALayer) {
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 0))
path.addCurve(
to: CGPoint(x: 200, y: 300),
controlPoint1: CGPoint(x: 100, y: 0),
controlPoint2: CGPoint(x: 100, y: 300)
)
let anim = CAKeyframeAnimation(keyPath: "position")
anim.path = path.cgPath
anim.duration = 1.5
anim.calculationMode = .cubicPaced
anim.rotationMode = .auto
anim.fillMode = .forwards
anim.isRemovedOnCompletion = false
layer.add(anim, forKey: "pathAnim")
layer.position = CGPoint(x: 200, y: 300)
}
// CAKeyframeAnimation কাস্টম মান সহ
func bounceAnimation(_ layer: CALayer) {
let bounce = CAKeyframeAnimation(keyPath: "position.y")
bounce.values = [0, -50, 0, -25, 0, -10, 0]
bounce.keyTimes = [0, 0.15, 0.3, 0.45, 0.6, 0.8, 1.0]
bounce.duration = 0.8
bounce.timingFunction = CAMediaTimingFunction(name: .easeOut)
bounce.isAdditive = true // বর্তমান অবস্থানের সাপেক্ষে
layer.add(bounce, forKey: nil)
}CAAnimationGroup 2.0 সময়কালের সাথে fade, scale এবং rotate সমান্তরালে নির্বাহ করে। CAKeyframeAnimation path এবং calculationMode = .cubicPaced সহ স্বয়ংক্রিয় ঘূর্ণন (rotationMode = .auto) সহ Bezier বক্ররেখা বরাবর অভিন্ন গতি প্রদান করে। bounceAnimation আপেক্ষিক অফসেটের জন্য isAdditive ব্যবহার করে।
কন্টেন্ট সুইচিংয়ের জন্য CATransition এবং পালস ইফেক্টের জন্য CAAnimationGroup ব্যবহার করে জটিল লেয়ার অ্যানিমেশনের একটি সম্পূর্ণ CAAnimation উদাহরণ।
import UIKit
import QuartzCore
class AnimationDemoView: UIView {
private let demoLayer = CALayer()
private var currentColor: CGColor = UIColor.systemBlue.cgColor
override func layoutSubviews() {
super.layoutSubviews()
demoLayer.frame = CGRect(x: bounds.midX - 40, y: bounds.midY - 40,
width: 80, height: 80)
demoLayer.backgroundColor = currentColor
demoLayer.cornerRadius = 12
layer.addSublayer(demoLayer)
}
func animateTransition() {
// CATransition — অবস্থার মধ্যে ট্রানজিশন
let transition = CATransition()
transition.type = .fade
transition.duration = 0.5
transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
demoLayer.add(transition, forKey: nil)
// লেনদেনের মাধ্যমে কন্টেন্ট পরিবর্তন
currentColor = currentColor == UIColor.systemBlue.cgColor
? UIColor.systemRed.cgColor
: UIColor.systemBlue.cgColor
demoLayer.backgroundColor = currentColor
}
func startPulse() {
let scaleUp = CABasicAnimation(keyPath: "transform.scale")
scaleUp.fromValue = 1.0
scaleUp.toValue = 1.3
let fadeOut = CABasicAnimation(keyPath: "opacity")
fadeOut.fromValue = 1.0
fadeOut.toValue = 0.6
let glow = CABasicAnimation(keyPath: "shadowOpacity")
glow.fromValue = 0.0
glow.toValue = 0.8
let group = CAAnimationGroup()
group.animations = [scaleUp, fadeOut, glow]
group.duration = 1.2
group.autoreverses = true
group.repeatCount = .infinity
group.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
demoLayer.add(group, forKey: "pulse")
}
func stopAnimations() {
demoLayer.removeAllAnimations()
demoLayer.transform = CATransform3DIdentity
demoLayer.opacity = 1.0
demoLayer.shadowOpacity = 0.0
}
}type: .fade সহ CATransition দুটি backgroundColor অবস্থার মধ্যে একটি মসৃণ ট্রানজিশন তৈরি করে। CAAnimationGroup পালস ইফেক্টের জন্য scale, opacity এবং shadowOpacity একত্রিত করে। removeAllAnimations() সমস্ত অ্যানিমেশন বাতিল করে এবং লেয়ারকে তার মূল মডেল লেয়ার মানগুলিতে ফিরিয়ে আনে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
CABasicAnimation একটি বৈশিষ্ট্যকে প্রাথমিক (fromValue) থেকে চূড়ান্ত (toValue) মান পর্যন্ত অভিন্ন ইন্টারপোলেশন সহ অ্যানিমেট করে। CAKeyframeAnimation আপনাকে অ-রৈখিক কীফ্রেম অ্যানিমেশনের জন্য মধ্যবর্তী মান (values) এবং সময় টিকিটের (keyTimes) একটি অ্যারে নির্দিষ্ট করার অনুমতি দেয়, যার মধ্যে path-এর মাধ্যমে বক্র-ভিত্তিক গতি অন্তর্ভুক্ত।
CAAnimationGroup প্রয়োজন যখন একাধিক অ্যানিমেশনকে গ্যারান্টিড সিঙ্ক্রোনাইজেশন সহ সমান্তরালে চলতে হবে: গ্রুপের সময়কাল সমস্ত চাইল্ড অ্যানিমেশনকে সীমিত করে। সম্মিলিত ইফেক্টের জন্য group ব্যবহার করুন: একসাথে স্কেলিং + অস্বচ্ছতা পরিবর্তন + ঘূর্ণন।
fillMode অ্যানিমেশনের আগে (backwards) এবং পরে (forwards) লেয়ার প্রদর্শন নির্ধারণ করে। মান .forwards অ্যানিমেশন সম্পূর্ণ হওয়ার পর লেয়ারকে চূড়ান্ত অবস্থায় রাখে (isRemovedOnCompletion = false প্রয়োজন)। .both backwards (শুরুর আগে প্রাথমিক অবস্থা) এবং forwards একত্রিত করে।
CAAnimation হল একটি অ্যানিমেশন অবজেক্ট (নির্দেশ) যা layer.add(animation, forKey:) এর মাধ্যমে CALayer-এ যোগ করা হয়। অ্যানিমেশন একটি পৃথক অবজেক্ট হিসেবে বিদ্যমান, পুনরায় ব্যবহার করা যেতে পারে (কপি করে) এবং CAMediaTiming-এর মাধ্যমে পরিচালিত হয়। একটি লেয়ারে বিভিন্ন কী সহ একাধিক অ্যানিমেশন থাকতে পারে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন