অ্যানিমেশনগুলি সাধারণত একটি অ্যাপ বা ওয়েবসাইটের ভিজ্যুয়াল আবেদন বাড়ায় এবং ব্যবহারকারীদের সামগ্রিক ব্যস্ততা উন্নত করে। ফরেস্টার রিসার্চের একটি সমীক্ষা অনুসারে, ভালভাবে চালানো অ্যানিমেশন সহ ওয়েবসাইটগুলি 400% পর্যন্ত ব্যবহারকারীর ব্যস্ততা বৃদ্ধির অভিজ্ঞতা অর্জন করে। আকর্ষক অ্যানিমেশন ব্যবহারকারীদের দৃষ্টি আকর্ষণ করতে পারে এবং প্ল্যাটফর্মের সাথে আরও বেশি যোগাযোগ করতে উত্সাহিত করতে পারে। যাইহোক, বিকাশকারীদের জন্য অ্যানিমেশন আয়ত্ত করার জন্য একটি শেখার বক্ররেখা রয়েছে, বিশেষ করে যখন আরও উন্নত অ্যানিমেশন সরঞ্জাম এবং কৌশলগুলির সাথে কাজ করা হয়।
অ্যানিমেশনে কোনো অভিজ্ঞতা ছাড়াই একজন ডেভেলপার হিসেবে রিভকে গ্রাস করা অন্যান্য অ্যানিমেশন টুল বা ফ্রেমওয়ার্কের তুলনায় তুলনামূলকভাবে সহজ হতে পারে। রিভ (পূর্বে ফ্লেয়ার নামে পরিচিত) ডিজাইন করা হয়েছে ব্যবহারকারী-বান্ধব এবং ডেভেলপারদের কাছে অ্যাক্সেসযোগ্য, এমনকি যাদের অ্যানিমেশনের অভিজ্ঞতা কম বা কোনো পূর্বে নেই। এই নিবন্ধে, আপনি শিখবেন কীভাবে সহজে অত্যাশ্চর্য রিভ অ্যানিমেশন তৈরি করবেন এবং আপনার ফ্লাটার অ্যাপে সেগুলি পরিচালনা করবেন।
রিভের ভূমিকা🧙♂️
একটি সাধারণ ইন্টারেক্টিভ লগইন অ্যানিমেশন🚀
উপসংহার🏋️♀️
তথ্যসূত্র🧶
Rive একটি শক্তিশালী এবং ব্যবহারকারী-বান্ধব অ্যানিমেশন টুল এবং রানটাইম ইঞ্জিন যা ডেভেলপার এবং ডিজাইনারদের মোবাইল অ্যাপ, ওয়েব অ্যাপ্লিকেশন এবং গেম সহ বিভিন্ন প্ল্যাটফর্মের জন্য অত্যাশ্চর্য এবং ইন্টারেক্টিভ অ্যানিমেশন তৈরি করতে সক্ষম করে।
এখানে মূল ধারণা আছে:
আমরা একটি সাধারণ লগইন অ্যানিমেশন তৈরি করার এবং এটিকে আমাদের ফ্লাটার অ্যাপে রপ্তানি করার প্রক্রিয়ার মধ্য দিয়ে যাব। অ্যাপটিতে এই অ্যানিমেশনের ইন্টারঅ্যাকটিভিটি পরিচালনা করতে আমরা স্টেটমেশিন ব্যবহার করব। শেষ পর্যন্ত, এটি এইরকম হওয়া উচিত 👇🏽
রিভ আর্টবোর্ডে উপাদান সেট আপ করতে নীচের পদক্ষেপগুলি অনুসরণ করুন:
এর পরে, আমরা আমাদের হাড়গুলিকে বাঁধব এবং তাদের ওজন করব। বাঁধাই নিশ্চিত করে যে যখন একটি হাড় নড়াচড়া করে, চরিত্রের পৃষ্ঠের সংশ্লিষ্ট অংশগুলি সেই অনুযায়ী নড়াচড়া করে, বিকৃতির বিভ্রম তৈরি করে। ভারটেক্স ওয়েটিং নামেও পরিচিত ওয়েটিং, নির্দিষ্ট হাড়ের নৈকট্যের উপর ভিত্তি করে অক্ষরের জালের প্রতিটি শীর্ষে প্রভাবের মান (ওজন) নির্ধারণ করে। আমরা আকৃতির পথে নেভিগেট করব যা আমরা বাঁধাই করব। ঘাড়ের জন্য, এইভাবে আমরা ঘাড়ের হাড়ের সাথে এটি আবদ্ধ করি।
হাড়গুলি বাঁধার পরে, আমরা তাদের ওজন নির্ধারণ করে শীর্ষবিন্দুগুলি সেট করি। এখানে, লক্ষ্য করুন যে আমরা শীর্ষবিন্দুর শেষ সেটটি 50% এ রেখেছি কারণ আমরা চাই যে দুটি হাড় তাদের উপর 50% প্রভাব ফেলুক। আপনার 50% ব্যবহার করা উচিত, বিশেষ করে যখন সেটের শীর্ষবিন্দু দুটি হাড়কে প্রভাবিত করে এমন একটি অংশকে আবৃত করে। এখন, আমরা চুলের পথের জন্য একই কাজ করব। আমরা চুলের জন্য যে প্রবাহিত নড়াচড়া করতে চাই তা অর্জন করতে সাহায্য করার জন্য আমরা বাম এবং ডান হাড়গুলিকে এক থেকে দুটি হাড় থেকে পরিবর্তন করব।
আমরা এই অ্যানিমেশনে একটি ব্লিঙ্কিং প্রভাব রাখতে চাই, এটি অর্জন করতে, আমরা দুটি চোখের আকৃতিতে এইভাবে ক্লিপ বৈশিষ্ট্যটি ব্যবহার করব 👇🏽
এর পরে, আমরা এই উপাদানটিতে অনুবাদ সীমাবদ্ধতা ব্যবহার করে হেড ট্র্যাকিং যুক্ত করব কারণ আমরা অ্যানিমেশনের সময় মাথা সরাতে চাই। যেহেতু এটি একটি 2d উপাদান, অনুবাদের সীমাবদ্ধতা যোগ করা এটিকে গভীরতা এবং 3d প্রভাবের কিছু রূপ দেবে। সবকিছু নির্বাচন করুন এবং এটি গ্রুপ করুন। এখন আমাদের একটি একক দল আছে।
তারপরে, উপরের বাম কোণে, গ্রুপ টুলটি নির্বাচন করুন এবং মাথার কেন্দ্রে (নাকের এলাকায়) একটি গ্রুপ তৈরি করুন। ডানদিকে টুলবারে, গ্রুপ থেকে টার্গেটে এর স্টাইল পরিবর্তন করুন, এটির নাম দিন ctrl_front, ডুপ্লিকেট করুন এবং ডুপ্লিকেট ctrl_back নাম দিন।
লক্ষ্য ctrl_back-এর জন্য, ডানদিকে টুলবার থেকে সীমাবদ্ধতা বিকল্পটি নির্বাচন করুন। উপলব্ধ সীমাবদ্ধতার বিকল্পগুলির তালিকা থেকে অনুবাদের সীমাবদ্ধতাগুলি বেছে নিন। এর বৈশিষ্ট্যগুলি সেট করতে নির্বাচিত সীমাবদ্ধতার বিকল্পের আগে আইকনে ক্লিক করুন।
শক্তি -100 এ সেট করুন এবং এর লক্ষ্য ctrl ফ্রন্টে সেট করুন। এখন আপনি যখন ctrl সামনে নিয়ে যান, তখন ctrl পিছনে বিপরীত দিকে চলে যায়। এটি আমাদের মুখের অংশগুলির জন্য সীমাবদ্ধতা সেট করতে সাহায্য করবে যা কানের মতো বিপরীত দিকে যেতে হবে। এটা এই মত দেখতে হবে 👇🏽
এখন আমরা বাকি মুখের জন্য সীমাবদ্ধতা সেট করব। আমরা চোখ (বাম এবং ডান) এবং কান (বাম এবং ডান) এগুলিকে আরও ভালভাবে পরিচালনা করতে আমাদের সাহায্য করার জন্য গ্রুপ করব। আমরা এইভাবে চোখের জন্য সীমাবদ্ধতা নির্ধারণ করব 👇🏽
গ্রুপ | সীমাবদ্ধতা শক্তি | মূল অবস্থান | টার্গেট |
---|---|---|---|
চশমা | ৫% | ctrl_front অরিজিনের মতোই | ctrl_front |
ভ্রু | 10% | ctrl_front অরিজিনের মতোই | ctrl_front |
কান | ৫% | মূল সেট করার প্রয়োজন নেই | ctrl_back |
নাক | ৫% | ctrl_front অরিজিনের মতোই | ctrl_front |
মুখ | ৫% | ctrl_front অরিজিনের মতোই | ctrl_front |
আমাদের ঠোঁটের জন্য সীমাবদ্ধতা সেট করার দরকার নেই।
আমরা আমাদের সমস্ত সীমাবদ্ধতা যোগ করা শেষ করার পরে এটি এমন দেখায় 👇🏽
💃🏽 🥳 অভিনন্দন, আমরা যে ধরনের অ্যানিমেশন অর্জন করতে চাই তার জন্য আমরা সফলভাবে আমাদের উপাদান প্রস্তুত করেছি। বাহ!!
ডানদিকে টুলবারে, অ্যানিমেশন ইন্টারফেসে স্যুইচ করতে অ্যানিমেট বোতামে ক্লিক করুন। আমরা ছয়টি অ্যানিমেশন টাইমলাইন তৈরি করব এবং একটি রাষ্ট্রীয় মেশিনের সাথে সবকিছু বেঁধে দেব। টাইমলাইনে, হাড় এবং সীমাবদ্ধতার সাথে আমরা আগে যা সেট আপ করেছি তা ব্যবহার করে, আমরা যে অ্যানিমেশনটি অর্জন করতে চাই তা তৈরি করতে আমরা কীফ্রেম সেট করতে পারি।
প্রথম টাইমলাইন অ্যানিমেশন হল নিষ্ক্রিয় অ্যানিমেশন। এটি অ্যানিমেশনের নিষ্ক্রিয় অবস্থা হবে। অ্যানিমেটেড উপাদান নিযুক্ত না হলে আমরা এটি ব্যবহার করব।
এই নিষ্ক্রিয় অ্যানিমেশনের জন্য, আমরা শ্বাস-প্রশ্বাস, চুলের সামান্য নড়াচড়া এবং ঝিমঝিম করার একটি বিভ্রম তৈরি করব। ঘাড়ের হাড়, চুলের হাড় এবং ডান/বাম চোখের উপাদানগুলি ব্যবহার করে, আমরা বিভিন্ন ভঙ্গিতে প্রয়োজনীয় কীফ্রেমগুলি সেট করব, যার অর্থ আমরা টাইমলাইনের পয়েন্টগুলিতে নির্বাচিত আইটেমের নির্দিষ্ট বৈশিষ্ট্যগুলি সেট করতে পারি। একটি কীফ্রেম থেকে পরবর্তীতে রূপান্তর শৈলী বিবেচনা করে, আমরা আমাদের প্রয়োজনীয় ইন্টারপোলেশন নির্বাচন করব। আপনি টাইমলাইন বিভাগের ডানদিকে নীচে এটি খুঁজে পেতে পারেন। আপনি কীভাবে একটি কীফ্রেম থেকে পরবর্তীতে যেতে চান তার উপর নির্ভর করে ইন্টারপোলেশন হয় হোল্ড, লিনিয়ার বা বক্ররেখা। দেখতে এরকম হবে 👇🏽
উপরের জিআইএফ থেকে, আপনি লক্ষ্য করতে পারেন যে টাইমলাইনে বিভিন্ন কীফ্রেমে, আমরা নির্বাচিত আইটেমগুলির জন্য বিভিন্ন ভঙ্গি সেট করেছি। একটি কীফ্রেম থেকে অন্য কীফ্রেমে এই রূপান্তরটি অ্যানিমেশন গঠন করে। এই একই পদ্ধতি ব্যবহার করে, আমরা অন্য পাঁচটি সময়রেখা তৈরি করব। আপনি এই অ্যানিমেশনটি দেখতে এখানে ক্লিক করতে পারেন এবং বিশদভাবে বিভিন্ন টাইমলাইন দেখতে পারেন। এটা এই মত দেখায় 👇🏽
আমরা এই অ্যানিমেশন প্রক্রিয়ার চূড়ান্ত অংশে চলে এসেছি। একটি রাষ্ট্রীয় মেশিন অ্যানিমেশন সংযোগ করার একটি চাক্ষুষ উপায়. স্টেট মেশিন ব্যবহার করে, আমরা যে ইনপুট সেট করেছি তার উপর ভিত্তি করে কোন অ্যানিমেশন বাজবে তা নিয়ন্ত্রণ করতে পারি। আমরা দুই বা ততোধিক টাইমলাইন অ্যানিমেশন মিশ্রিত বা মিশ্রিত করতে পারি যাতে তারা একই সাথে খেলতে পারে। আমাদের অবশ্যই স্টেট মেশিনে সঠিক ধরনের ইনপুট নির্বাচন করতে হবে কারণ এটিই আমরা অ্যাপে অ্যানিমেশন নিয়ন্ত্রণ করতে ব্যবহার করব।
রাষ্ট্রীয় মেশিনে, আমাদের তিনটি ধরণের ইনপুট রয়েছে:
অ্যানিমেশন প্যানেলে, প্লাস বোতামে ক্লিক করুন এবং একটি স্টেট মেশিন তৈরি করুন। আমরা এর নাম দেব লগইন স্টেট মেশিন । এই নামটি গুরুত্বপূর্ণ কারণ কোডটিতে পরে আমাদের রাষ্ট্রীয় মেশিনটি সনাক্ত করতে হবে।
আপনার স্টেট মেশিন সেট আপ করতে নীচের পদক্ষেপগুলি অনুসরণ করুন:
এখন স্টেট মেশিনে সম্পূর্ণ অ্যানিমেশনটি এরকম দেখাবে 👇🏽
এখানে সম্পূর্ণ অ্যানিমেশন এবং স্টেট মেশিন দেখুন।
অভিনন্দন 🥳, আমরা সফলভাবে আমাদের উপাদান অ্যানিমেট করেছি এবং এটিকে একটি রাষ্ট্রীয় মেশিন দিয়ে সেট আপ করেছি! যাইহোক, আমরা রিভ ফাইল রপ্তানি করার আগে, আমরা ব্যাকগ্রাউন্ড এবং অক্ষরের শার্টের রঙ পরিবর্তন করব। এটা এরকম দেখাবে👇🏽
ব্যাকগ্রাউন্ডের রঙ হল (#B581EB) এবং চরিত্রের শার্টের রঙ হল (#BD08D7)
এখানে অ্যানিমেশনের লিঙ্কটি বিস্তারিতভাবে দেখুন
আমরা আমাদের লগইন পৃষ্ঠায় এই অ্যানিমেশনটি ব্যবহার করব। একটি Flutter অ্যাপ প্রকল্প তৈরি করুন এবং pubspec.yaml
এ রিভ নির্ভরতা যোগ করুন
dependencies: rive: ^0.11.12
এছাড়াও, আপনার প্রকল্প সম্পদে রপ্তানি করা রিভ ফাইল যোগ করুন। এখন আমরা আমাদের ডিজাইনের উপর ভিত্তি করে UI তৈরি করতে এগিয়ে যেতে পারি। আমরা অ্যানিমেশনটি নিম্নলিখিতগুলি করতে চাই:
উইজেট বিল্ড ফাংশনের আগে আমরা প্রথমে কিছু জিনিস সংজ্ঞায়িত করব।
///Login details String emailCred = "[email protected]"; String passwordCred = "123456"; /// input form controller FocusNode emailFocusNode = FocusNode(); TextEditingController emailCtr = TextEditingController(); FocusNode passwordFocusNode = FocusNode(); TextEditingController passwordCtr = TextEditingController(); /// rive controller and input values StateMachineController? controller; SMIInput<bool>? check; SMIInput<double>? look; SMIInput<bool>? success; SMIInput<bool>? fail; bool isLoading = false; bool isError = false; @override void initState() { emailFocusNode.addListener(emailFocus); passwordFocusNode.addListener(passwordFocus); super.initState(); } @override void dispose() { emailFocusNode.removeListener(emailFocus); passwordFocusNode.removeListener(passwordFocus); super.dispose(); } void emailFocus() { check?.change(emailFocusNode.hasFocus); } void passwordFocus() { check?.change(passwordFocusNode.hasFocus); }
এখানে, আমরা নিম্নলিখিত নোট করতে পারি:
emailFocus
এবং passwordFocus
ফাংশনে, বুলিয়ান FocusNode.hasFocus
উপর ভিত্তি করে চেক ইনপুট পরিবর্তন করা হয়initState
এবং dispose
ফাংশনে, আমরা দেখতে পাচ্ছি Listeners যোগ করা হয়েছে এবং সরানো হয়েছে। শ্রোতাদের ফোকাস পরিবর্তন শুনতে ব্যবহার করা হয়.
আপনি UI এর কোড এবং বাকি কোডটি এখানে দেখতে পারেন। কোডের এই অংশটি দেখায় কিভাবে RiveAsset যোগ করতে হয়:
SizedBox( height: 250, width: 250, child: RiveAnimation.asset( "assets/login_screen.riv", fit: BoxFit.fitHeight, stateMachines: const ["Login State Machine"], onInit: (artboard) { controller = StateMachineController.fromArtboard( artboard, "Login State Machine", ); if (controller == null) return; artboard.addController(controller!); check = controller?.findInput("check"); look = controller?.findInput("look"); success = controller?.findInput("success"); fail = controller?.findInput("fail"); }, ), ),
উপরের কোড থেকে, আমরা নিম্নলিখিত নোট করতে পারি:
এখানে লগইন ফাংশনের জন্য কোড আছে:
void login()async{ //extract the text coming from the text fields final email = emailCtr.text; final password = passwordCtr.text; //Set loading boolean to true and delay to give an illusion of loading setState(() { isLoading = true; }); await Future.delayed( const Duration(milliseconds: 2000), ); // check if details entered is the same as the correct creditials defined if (email == emailCred && password == passwordCred) { //if correct trigger the success input and set error boolean to false success?.change(true); setState(() { isError = false; }); if(context.mounted){ // delay and navigate to home screen await Future.delayed( const Duration(seconds: 2),(){ Navigator.push(context, MaterialPageRoute(builder: (context) =>const HomeScreen())); }); } } else { // if details don't match defined credentials // set error boolean to true and trigger the fail input // set loading boolean to false setState(() { isError = true; }); fail?.change(true); } setState(() { isLoading = false; }); }
এখানে সম্পূর্ণ কোড দেখুন.
এটি করার মাধ্যমে, আমরা আমাদের লগইন অ্যানিমেশন কোড সম্পূর্ণ করেছি। এখানে সবকিছু কিভাবে দেখায়:
অভিনন্দন! আমরা এই সহজ ইন্টারেক্টিভ লগইন অ্যানিমেশন সম্পন্ন করেছি। এখানে আমরা যা করতে পেরেছি তার একটি ওভারভিউ রয়েছে:
ধাপে ধাপে এই টিউটোরিয়ালটি অনুসরণ করে, আপনি কিছু বাধার সম্মুখীন হতে পারেন, কিন্তু অনুশীলনের মাধ্যমে এটি সহজ হয়ে যাবে। এই টিউটোরিয়ালটি অনুসরণ করার সময় আপনার সাহায্যের প্রয়োজন হলে আপনি টুইটারে আমার সাথে যোগাযোগ করতে পারেন বা মন্তব্য করতে পারেন।
Rive অ্যানিমেশনের আরও ভাল উপলব্ধি পেতে এই ভিডিও টিউটোরিয়ালগুলি দেখুন
আপনি Rive অ্যানিমেশনের বিভিন্ন ভিডিও টিউটোরিয়ালের জন্য Rive চ্যানেলটিও দেখতে পারেন।
এছাড়াও এখানে প্রকাশিত.