আপনি ভিউ-এর উপর টুইনড অ্যানিমেশন সম্পাদন করতে ভিউ অ্যানিমেশন সিস্টেম ব্যবহার করতে পারেন। টুইন অ্যানিমেশন, শুরু ও শেষ বিন্দু, আকার, ঘূর্ণন এবং একটি অ্যানিমেশনের অন্যান্য সাধারণ দিকের মতো তথ্য দিয়ে অ্যানিমেশনটি গণনা করে।
একটি টুইন অ্যানিমেশন একটি ভিউ অবজেক্টের বিষয়বস্তুর উপর ধারাবাহিক কিছু সাধারণ রূপান্তর (অবস্থান, আকার, ঘূর্ণন এবং স্বচ্ছতা) সম্পাদন করতে পারে। সুতরাং, যদি আপনার একটি TextView অবজেক্ট থাকে, তবে আপনি টেক্সটটিকে সরাতে, ঘোরাতে, বড় করতে বা ছোট করতে পারেন। যদি এতে একটি ব্যাকগ্রাউন্ড ইমেজ থাকে, তবে টেক্সটের সাথে ব্যাকগ্রাউন্ড ইমেজটিও রূপান্তরিত হবে। animation package একটি টুইন অ্যানিমেশনে ব্যবহৃত সমস্ত ক্লাস সরবরাহ করে।
অ্যানিমেশন নির্দেশাবলীর একটি ক্রম টুইন অ্যানিমেশনকে সংজ্ঞায়িত করে, যা XML অথবা অ্যান্ড্রয়েড কোডের মাধ্যমে নির্ধারিত হয়। লেআউট সংজ্ঞায়িত করার মতোই, একটি XML ফাইল ব্যবহার করার পরামর্শ দেওয়া হয়, কারণ অ্যানিমেশন হার্ড-কোড করার চেয়ে এটি বেশি পাঠযোগ্য, পুনঃব্যবহারযোগ্য এবং পরিবর্তনযোগ্য। নিচের উদাহরণে, আমরা XML ব্যবহার করেছি। (XML-এর পরিবর্তে আপনার অ্যাপ্লিকেশন কোডে অ্যানিমেশন সংজ্ঞায়িত করার বিষয়ে আরও জানতে, AnimationSet ক্লাস এবং অন্যান্য Animation সাবক্লাসগুলো দেখুন।)
অ্যানিমেশন নির্দেশাবলী নির্ধারণ করে দেয় যে আপনি কোন রূপান্তরগুলো ঘটাতে চান, কখন সেগুলো ঘটবে এবং সেগুলো প্রয়োগ হতে কত সময় লাগবে। রূপান্তরগুলো পর্যায়ক্রমিক বা যুগপৎ হতে পারে - উদাহরণস্বরূপ, আপনি একটি TextView-এর বিষয়বস্তুকে বাম থেকে ডানে সরাতে পারেন এবং তারপর ১৮০ ডিগ্রি ঘোরাতে পারেন, অথবা আপনি লেখাটিকে একই সাথে সরাতে ও ঘোরাতে পারেন। প্রতিটি রূপান্তর সেই রূপান্তরের জন্য নির্দিষ্ট কিছু প্যারামিটার (আকার পরিবর্তনের জন্য শুরুর ও শেষের আকার, ঘোরানোর জন্য শুরুর ও শেষের কোণ, ইত্যাদি) এবং কিছু সাধারণ প্যারামিটার (যেমন, শুরুর সময় এবং সময়কাল) গ্রহণ করে। একাধিক রূপান্তর একই সাথে ঘটাতে, সেগুলোকে একই শুরুর সময় দিন; সেগুলোকে পর্যায়ক্রমিক করতে, শুরুর সময়ের সাথে পূর্ববর্তী রূপান্তরের সময়কাল যোগ করে গণনা করুন।
অ্যানিমেশন XML ফাইলটি আপনার অ্যান্ড্রয়েড প্রজেক্টের res/anim/ ডিরেক্টরিতে থাকবে। ফাইলটিতে অবশ্যই একটিমাত্র রুট এলিমেন্ট থাকতে হবে: এটি হয় একটিমাত্র <alpha> , <scale> , <translate> , <rotate> , interpolator এলিমেন্ট, অথবা <set> এলিমেন্ট হবে যা এই এলিমেন্টগুলোর গ্রুপ ধারণ করে (যার মধ্যে আরেকটি <set> থাকতে পারে)। ডিফল্টভাবে, সমস্ত অ্যানিমেশন নির্দেশনা একই সাথে প্রয়োগ করা হয়। এগুলোকে ক্রমানুসারে ঘটাতে হলে, আপনাকে startOffset অ্যাট্রিবিউটটি নির্দিষ্ট করতে হবে, যেমনটি নিচের উদাহরণে দেখানো হয়েছে।
একটি ApiDemo থেকে নেওয়া নিম্নলিখিত XML-টি একটি View অবজেক্টকে প্রথমে প্রসারিত করতে, এবং তারপর একই সাথে ঘোরানো ও আবর্তন করতে ব্যবহৃত হয়।
<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>
স্ক্রিনের স্থানাঙ্ক (এই উদাহরণে ব্যবহৃত নয়) হলো উপরের বাম কোণায় (0,0), এবং এটি নিচে ও ডানে যাওয়ার সাথে সাথে বাড়তে থাকে।
pivotX-এর মতো কিছু মান অবজেক্টটির নিজের সাপেক্ষে অথবা প্যারেন্টের সাপেক্ষে নির্দিষ্ট করা যেতে পারে। আপনি যা চান তার জন্য সঠিক ফরম্যাটটি ব্যবহার করতে ভুলবেন না ("50" প্যারেন্টের সাপেক্ষে ৫০%-এর জন্য, অথবা "50%" নিজের সাপেক্ষে ৫০%-এর জন্য)।
একটি Interpolator নির্ধারণ করার মাধ্যমে আপনি ঠিক করতে পারেন যে সময়ের সাথে সাথে একটি ট্রান্সফরমেশন কীভাবে প্রয়োগ করা হবে। অ্যান্ড্রয়েডে বেশ কয়েকটি ইন্টারপোলেটর সাবক্লাস রয়েছে যা বিভিন্ন গতির বক্ররেখা নির্দিষ্ট করে: উদাহরণস্বরূপ, AccelerateInterpolator একটি ট্রান্সফরমেশনকে ধীরে শুরু করে গতি বাড়াতে নির্দেশ দেয়। এগুলোর প্রতিটির একটি অ্যাট্রিবিউট ভ্যালু থাকে যা XML-এ প্রয়োগ করা যায়।
প্রজেক্টের res/anim/ ডিরেক্টরিতে hyperspace_jump.xml নামে এই XML ফাইলটি সেভ করা থাকলে, নিচের কোডটি এটিকে রেফারেন্স করবে এবং লেআউটের একটি ImageView অবজেক্টে প্রয়োগ করবে।
কোটলিন
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 সিনট্যাক্স, উপলব্ধ ট্যাগ এবং অ্যাট্রিবিউট সম্পর্কে আরও তথ্যের জন্য, অ্যানিমেশন রিসোর্স দেখুন।
দ্রষ্টব্য: আপনার অ্যানিমেশন যেভাবে নড়াচড়া বা আকার পরিবর্তন করুক না কেন, যে ভিউটি আপনার অ্যানিমেশন ধারণ করে তার সীমানা এটিকে জায়গা দেওয়ার জন্য স্বয়ংক্রিয়ভাবে সামঞ্জস্য হবে না। তা সত্ত্বেও, অ্যানিমেশনটি তার ভিউ-এর সীমানার বাইরেও অঙ্কিত হবে এবং ক্লিপড হবে না। তবে, অ্যানিমেশনটি যদি প্যারেন্ট ভিউ-এর সীমানা অতিক্রম করে, তাহলে ক্লিপিং ঘটবে ।
