আপনি ভিউতে টুইনড অ্যানিমেশন পারফর্ম করতে ভিউ অ্যানিমেশন সিস্টেম ব্যবহার করতে পারেন। টুইন অ্যানিমেশন শুরুর পয়েন্ট, শেষের পয়েন্ট, সাইজ, রোটেশন এবং অ্যানিমেশনের অন্যান্য সাধারণ দিকের মতো তথ্য সহ অ্যানিমেশন গণনা করে।
একটি টুইন অ্যানিমেশন, ভিউ অবজেক্টের কন্টেন্টে একাধিক সহজ ট্রান্সফর্মেশন (অবস্থান, সাইজ, রোটেশন
এবং ট্রান্সপারেন্সি) করতে পারে। তাই, আপনার কাছে TextView অবজেক্ট থাকলে, আপনি টেক্সট সরাতে, ঘোরাতে, বড় বা ছোট করতে পারবেন। এতে ব্যাকগ্রাউন্ড ছবি থাকলে, ব্যাকগ্রাউন্ড ছবি টেক্সটের সাথে ট্রান্সফর্ম করা হবে। animation package টুইন অ্যানিমেশনে ব্যবহৃত সব ক্লাস প্রদান করে।
অ্যানিমেশন নির্দেশাবলীর একটি ক্রম টুইন অ্যানিমেশনকে সংজ্ঞায়িত করে, যা XML বা Android কোড দ্বারা সংজ্ঞায়িত করা হয়। লেআউট নির্ধারণ করার মতো, XML ফাইল ব্যবহার করার সাজেশন দেওয়া হয় কারণ এটি অ্যানিমেশন হার্ড-কোডিং করার চেয়ে
আরও বেশি পাঠযোগ্য, পুনর্ব্যবহারযোগ্য এবং অদলবদলযোগ্য। নিচের উদাহরণে আমরা XML ব্যবহার করেছি। (XML-এর পরিবর্তে, আপনার অ্যাপ্লিকেশন কোডে অ্যানিমেশন সংজ্ঞায়িত করার বিষয়ে আরও জানতে, AnimationSet ক্লাস এবং অন্যান্য Animation সাবক্লাস দেখুন।)
অ্যানিমেশন সংক্রান্ত নির্দেশাবলী থেকে আপনি যে ট্রান্সফর্মেশন করতে চান, কখন তা হবে এবং তা প্রয়োগ করতে কত সময় লাগবে তা নির্ধারণ করা হয়। ট্রান্সফর্মেশন সিকোয়েন্সিয়াল বা একই সাথে হতে পারে - যেমন, আপনি TextView-এর কন্টেন্ট বাঁদিক থেকে ডানদিকে সরাতে পারেন এবং তারপরে ১৮০ ডিগ্রি ঘোরাতে পারেন অথবা আপনি টেক্সট একই সাথে সরাতে ও ঘোরাতে পারেন। প্রতিটি ট্রান্সফর্মেশনের জন্য সেই ট্রান্সফর্মেশনের নির্দিষ্ট প্যারামিটারের সেট (সাইজ পরিবর্তনের জন্য শুরুর সাইজ ও শেষের সাইজ, ঘোরানোর জন্য শুরুর কোণ ও শেষের কোণ ইত্যাদি) এবং সাধারণ প্যারামিটারের সেট (যেমন, শুরুর সময় ও সময়সীমা) প্রয়োজন হয়। একসাথে একাধিক ট্রান্সফর্মেশন করতে, সেগুলির শুরুর সময় একই রাখুন; সেগুলিকে ক্রমানুসারে করতে, শুরুর সময় এবং আগের ট্রান্সফর্মেশনের সময়কাল হিসেব করুন।
অ্যানিমেশন XML ফাইলটি আপনার Android প্রোজেক্টের res/anim/ ডিরেক্টরিতে
থাকে। ফাইলে অবশ্যই একটি রুট এলিমেন্ট থাকতে হবে: এটি একটি
<alpha>, <scale>, <translate>,
<rotate>, ইন্টারপোলেটর এলিমেন্ট অথবা <set> এলিমেন্ট হবে যা
এইসব এলিমেন্টের গ্রুপ (যার মধ্যে অন্য <set> থাকতে পারে) ধরে রাখে। ডিফল্ট হিসেবে, সব
অ্যানিমেশন নির্দেশাবলী একসাথে প্রয়োগ করা হয়। এগুলি যাতে একের পর এক ঘটে তা নিশ্চিত করতে, আপনাকে অবশ্যই
startOffset অ্যাট্রিবিউট নির্দিষ্ট করতে হবে, যেমনটি নিচের উদাহরণে দেখানো হয়েছে।
ApiDemos-এর একটি থেকে নিম্নলিখিত XML ব্যবহার করা হয়, যাতে একটি ভিউ অবজেক্টকে স্ট্রেচ, তারপর একই সাথে স্পিন এবং রোটেট করা যায়।
<set android:shareInterpolator="false"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0" android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="700" /> <set android:interpolator="@android:anim/decelerate_interpolator"> <scale android:fromXScale="1.4" android:toXScale="0.0" android:fromYScale="0.6" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" android:fillBefore="false" /> <rotate android:fromDegrees="0" android:toDegrees="-45" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" /> </set> </set>
স্ক্রিন কোঅর্ডিনেট (এই উদাহরণে ব্যবহার করা হয়নি) হল উপরের বাঁদিকের কোণে (০,০) এবং আপনি যত নিচে ও ডানদিকে যাবেন তত বাড়বে।
কিছু ভ্যালু, যেমন pivotX, অবজেক্টের সাপেক্ষে বা পেরেন্টের সাপেক্ষে নির্দিষ্ট করা যেতে পারে। আপনি যা চান তার জন্য সঠিক ফর্ম্যাট ব্যবহার করতে ভুলবেন না (প্যারেন্টের সাপেক্ষে ৫০% এর জন্য "৫০", বা নিজের সাপেক্ষে ৫০% এর জন্য "৫০%")।
আপনি Interpolator অ্যাসাইন করে, সময়ের সাথে সাথে কীভাবে ট্রান্সফর্মেশন প্রয়োগ করা হয় তা নির্ধারণ করতে পারবেন। Android-এ বেশ কিছু ইন্টারপোলেটর সাবক্লাস আছে যা
বিভিন্ন স্পিড কার্ভ নির্দিষ্ট করে: যেমন, AccelerateInterpolator
ট্রান্সফর্মেশনকে ধীরে শুরু করে স্পিড বাড়াতে বলে। প্রতিটির একটি অ্যাট্রিবিউট ভ্যালু আছে যা XML-এ
প্রয়োগ করা যেতে পারে।
এই XML প্রোজেক্টের res/anim/
ডিরেক্টরিতে hyperspace_jump.xml হিসেবে সেভ করা থাকলে, নিম্নলিখিত কোড এটির রেফারেন্স দেবে এবং লেআউট থেকে একটি ImageView অবজেক্টে এটি প্রয়োগ করবে।
Kotlin
AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump).also { hyperspaceJumpAnimation -> findViewById<ImageView>(R.id.spaceshipImage).startAnimation(hyperspaceJumpAnimation) }
জাভা
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); spaceshipImage.startAnimation(hyperspaceJumpAnimation);
startAnimation()-এর বিকল্প হিসেবে, আপনি -এর মাধ্যমে অ্যানিমেশনের শুরুর সময় নির্ধারণ করতে পারেন, তারপর Animation.setStartTime()-এর মাধ্যমে অ্যানিমেশনটি ভিউতে অ্যাসাইন করতে পারেন।View.setAnimation()
XML সিনট্যাক্স, উপলভ্য ট্যাগ ও অ্যাট্রিবিউট সম্পর্কে আরও জানতে, অ্যানিমেশন রিসোর্স দেখুন।
মনে রাখবেন: আপনার অ্যানিমেশন কীভাবে সরানো বা ছোট-বড় করা হতে পারে তা নির্বিশেষে, যে ভিউ আপনার অ্যানিমেশন ধরে রাখে তার বাউন্ডারি এটিকে মানানসই করার জন্য অটোমেটিক অ্যাডজাস্ট হবে না। এমনকি, অ্যানিমেশনটি এখনও তার ভিউয়ের সীমার বাইরে আঁকা হবে এবং ক্লিপ করা হবে না। তবে, অ্যানিমেশন পেরেন্ট ভিউয়ের সীমা অতিক্রম করলে ক্লিপিং হবে।