एनिमेशन आम तौर पर किसी ऐप या वेबसाइट की दृश्य अपील को बढ़ाते हैं और उपयोगकर्ताओं की समग्र सहभागिता में सुधार करते हैं। फॉरेस्टर रिसर्च के एक अध्ययन के अनुसार, अच्छी तरह से निष्पादित एनिमेशन वाली वेबसाइटें उपयोगकर्ता जुड़ाव में 400% तक की वृद्धि का अनुभव करती हैं। आकर्षक एनिमेशन उपयोगकर्ताओं का ध्यान आकर्षित कर सकते हैं और उन्हें प्लेटफ़ॉर्म के साथ अधिक बातचीत करने के लिए प्रोत्साहित कर सकते हैं। हालाँकि, डेवलपर्स के लिए एनीमेशन में महारत हासिल करना सीखने की प्रक्रिया है, खासकर जब अधिक उन्नत एनीमेशन टूल और तकनीकों के साथ काम कर रहे हों।
एनीमेशन में कोई अनुभव नहीं रखने वाले डेवलपर के रूप में रिव को समझना अन्य एनीमेशन टूल या फ्रेमवर्क की तुलना में अपेक्षाकृत आसान हो सकता है। रिव (पूर्व में फ़्लेयर के नाम से जाना जाता था) को उपयोगकर्ता के अनुकूल और डेवलपर्स के लिए सुलभ बनाया गया है, यहां तक कि उन लोगों के लिए भी जिनके पास एनीमेशन का बहुत कम या कोई पूर्व अनुभव नहीं है। इस लेख में, आप सीखेंगे कि कैसे आसानी से सरल आश्चर्यजनक रिव एनिमेशन बनाएं और उन्हें अपने फ़्लटर ऐप में प्रबंधित करें।
रिवाइव का परिचय🧙♂️
एक सरल इंटरैक्टिव लॉगिन एनीमेशन🚀
निष्कर्ष🏋️♀️
सन्दर्भ🧶
रिव एक शक्तिशाली और उपयोगकर्ता के अनुकूल एनीमेशन टूल और रनटाइम इंजन है जो डेवलपर्स और डिजाइनरों को मोबाइल ऐप, वेब एप्लिकेशन और गेम सहित विभिन्न प्लेटफार्मों के लिए आश्चर्यजनक और इंटरैक्टिव एनिमेशन बनाने में सक्षम बनाता है।
यहां प्रमुख अवधारणाएं हैं:
हम एक सरल लॉगिन एनीमेशन बनाने और इसे अपने फ़्लटर ऐप पर निर्यात करने की प्रक्रिया से गुजरेंगे। हम ऐप में इस एनीमेशन की अन्तरक्रियाशीलता को प्रबंधित करने के लिए स्टेटमशीन का उपयोग करेंगे। अंत में, इसे इस तरह दिखना चाहिए 👇🏽
रिव आर्टबोर्ड पर तत्व स्थापित करने के लिए नीचे दिए गए चरणों का पालन करें:
इसके बाद, हम अपनी हड्डियों को बांधेंगे और उनका वजन करेंगे। बाइंडिंग यह सुनिश्चित करती है कि जब कोई हड्डी हिलती है, तो चरित्र की सतह के संबंधित हिस्से तदनुसार हिलते हैं, जिससे विकृति का भ्रम पैदा होता है। वेटिंग, जिसे वर्टेक्स वेटिंग के रूप में भी जाना जाता है, में विशिष्ट हड्डियों के निकटता के आधार पर चरित्र के जाल के प्रत्येक शीर्ष पर प्रभाव मान (वजन) निर्दिष्ट करना शामिल है। हम उस आकार के पथ पर नेविगेट करेंगे जिसे हम बांधेंगे। गर्दन के लिए, इस तरह हम इसे गर्दन की हड्डी से बांधते हैं।
हड्डियों को बांधने के बाद, हम उन पर भार निर्दिष्ट करके शीर्षों को सेट करते हैं। यहां, ध्यान दें कि हमने शीर्षों के अंतिम सेट को 50% पर रखा है क्योंकि हम चाहते हैं कि दोनों हड्डियों पर 50% प्रभाव पड़े। आपको 50% का उपयोग करना चाहिए, खासकर जब सेट शीर्ष एक खंड को कवर करते हैं जो दो हड्डियों को प्रभावित करता है। अब, हम बाल पथ के लिए भी ऐसा ही करेंगे। हम बालों के लिए वांछित प्रवाहपूर्ण गति प्राप्त करने में मदद के लिए बायीं और दायीं हड्डियों को एक से दो हड्डियों में भी बदल देंगे।
हम इस एनीमेशन में पलक झपकाने का प्रभाव चाहते हैं, इसे प्राप्त करने के लिए, हम इस तरह की दो आंखों के आकार पर क्लिप सुविधा का उपयोग करेंगे 👇🏽
इसके बाद, हम इस तत्व में अनुवाद बाधाओं का उपयोग करके हेड ट्रैकिंग जोड़ेंगे क्योंकि हम एनीमेशन के दौरान हेड को स्थानांतरित करना चाहते हैं। चूँकि यह एक 2डी तत्व है, अनुवाद संबंधी बाधाओं को जोड़ने से इसे गहराई और कुछ प्रकार का 3डी प्रभाव मिलेगा। सब कुछ चुनें और उसे समूहित करें। अब हमारा एक समूह है.
फिर, ऊपरी बाएं कोने पर, समूह टूल का चयन करें और सिर के केंद्र में (नाक क्षेत्र पर) एक समूह बनाएं। दाईं ओर टूलबार पर, इसकी शैली को समूह से लक्ष्य में बदलें, इसे ctrl_front नाम दें, इसे डुप्लिकेट करें, और डुप्लिकेट को ctrl_back नाम दें।
लक्ष्य ctrl_back के लिए, दाईं ओर टूलबार से बाधा विकल्प का चयन करें। उपलब्ध बाधाओं के विकल्पों की सूची से अनुवाद बाधाओं को चुनें। इसके गुणों को सेट करने के लिए चयनित बाधा विकल्प से पहले आइकन पर क्लिक करें।
ताकत को -100 पर सेट करें और इसके लक्ष्य को Ctrl फ्रंट पर सेट करें। अब जब आप Ctrl को आगे की ओर ले जाते हैं, तो Ctrl पीछे की ओर विपरीत दिशा में चला जाता है। यह हमें चेहरे के उन हिस्सों के लिए बाधाएं निर्धारित करने में मदद करेगा जिन्हें कानों की तरह विपरीत दिशा में चलना चाहिए। इसे इस तरह दिखना चाहिए 👇🏽
अब हम चेहरे के बाकी हिस्सों के लिए बाधाएँ निर्धारित करेंगे। हम उन्हें बेहतर ढंग से प्रबंधित करने में मदद करने के लिए आंखों (बाएं और दाएं) और कानों (बाएं और दाएं) को भी समूहित करेंगे। हम आंखों के लिए कुछ इस तरह से बंदिशें तय करेंगे 👇🏽
समूह | बाधा शक्ति | मूल स्थिति | लक्ष्य |
---|---|---|---|
चश्मा | 5% | ctrl_front मूल के समान | ctrl_front |
भौंक | 10% | ctrl_front मूल के समान | ctrl_front |
कान | 5% | मूल निर्धारित करने की कोई आवश्यकता नहीं है | Ctrl_वापस |
नाक | 5% | ctrl_front मूल के समान | ctrl_front |
चेहरा | 5% | ctrl_front मूल के समान | ctrl_front |
हमें होठों के लिए कोई सीमा निर्धारित करने की आवश्यकता नहीं है।
अपनी सभी बाधाओं को जोड़ने के बाद यह इस तरह दिखता है 👇🏽
💃🏽 🥳 बधाई हो, हम जिस प्रकार के एनीमेशन को प्राप्त करना चाहते हैं उसके लिए हमने अपना तत्व सफलतापूर्वक तैयार कर लिया है। वाह!!
दाईं ओर टूलबार पर, एनीमेशन इंटरफ़ेस पर स्विच करने के लिए एनिमेट बटन पर क्लिक करें। हम छह एनीमेशन टाइमलाइन बनाएंगे और सब कुछ एक स्टेट मशीन के साथ जोड़ देंगे। टाइमलाइन में, हमने पहले हड्डियों और बाधाओं के साथ जो सेट किया है उसका उपयोग करके, हम उस एनीमेशन को बनाने के लिए कीफ़्रेम सेट कर सकते हैं जिसे हम प्राप्त करना चाहते हैं।
पहला टाइमलाइन एनीमेशन निष्क्रिय एनीमेशन है। यह एनीमेशन की निष्क्रिय स्थिति होगी। हम इसका उपयोग तब करेंगे जब एनिमेटेड तत्व संलग्न नहीं होगा।
इस निष्क्रिय एनीमेशन के लिए, हम सांस लेने, बालों की हल्की सी हलचल और पलकें झपकाने का भ्रम पैदा करेंगे। गर्दन की हड्डी, बालों की हड्डियों और दाहिनी/बाईं आंख के तत्वों का उपयोग करके, हम आवश्यक कीफ़्रेम को अलग-अलग पोज़ में सेट करेंगे, जिसका अर्थ है कि हम समयरेखा पर बिंदुओं पर चयनित आइटम के विशिष्ट गुणों को सेट कर सकते हैं। एक कीफ़्रेम से दूसरे कीफ़्रेम में परिवर्तन शैली को ध्यान में रखते हुए, हम उस प्रकार के इंटरपोलेशन का चयन करेंगे जिसकी हमें आवश्यकता है। आप इसे नीचे टाइमलाइन अनुभाग के दाईं ओर पा सकते हैं। इंटरपोलेशन या तो होल्ड, रैखिक या वक्र है, यह इस पर निर्भर करता है कि आप एक कीफ़्रेम से दूसरे कीफ़्रेम तक कैसे जाना चाहते हैं। यह इस तरह दिखेगा 👇🏽
ऊपर दिए गए GIF से, आप देख सकते हैं कि टाइमलाइन पर अलग-अलग कीफ़्रेम पर, हमने चयनित आइटम के लिए अलग-अलग पोज़ सेट किए हैं। एक कीफ़्रेम से दूसरे कीफ़्रेम में यह संक्रमण एनीमेशन बनाता है। इसी प्रक्रिया का उपयोग करके, हम अन्य पाँच समय-सीमाएँ बनाएंगे। इस एनिमेशन को देखने और विभिन्न समय-सीमाओं को विस्तार से देखने के लिए आप यहां क्लिक कर सकते हैं। ऐसा दिखता है 👇🏽
हम इस एनीमेशन प्रक्रिया के अंतिम भाग पर आ गए हैं। स्टेट मशीन एनीमेशन को जोड़ने का एक दृश्य तरीका है। स्टेट मशीन का उपयोग करके, हम यह नियंत्रित कर सकते हैं कि हमारे द्वारा सेट किए गए इनपुट के आधार पर कौन सा एनीमेशन चलेगा। हम दो या दो से अधिक टाइमलाइन एनिमेशन को मिश्रित या मिश्रित कर सकते हैं ताकि वे एक साथ चल सकें। हमें स्टेट मशीन में सही प्रकार के इनपुट का चयन करना होगा क्योंकि यही वह है जिसका उपयोग हम ऐप में एनीमेशन को नियंत्रित करने के लिए करेंगे।
स्टेट मशीन में, हमारे पास तीन प्रकार के इनपुट होते हैं:
एनिमेशन पैनल पर, प्लस बटन पर क्लिक करें और एक स्टेट मशीन बनाएं। हम इसे लॉगिन स्टेट मशीन नाम देंगे। यह नाम महत्वपूर्ण है क्योंकि हमें बाद में कोड में अपनी राज्य मशीन की पहचान करने के लिए इसी नाम की आवश्यकता होगी।
अपनी राज्य मशीन स्थापित करने के लिए नीचे दिए गए चरणों का पालन करें:
अब स्टेट मशीन में पूरा एनिमेशन इस तरह दिखेगा 👇🏽
संपूर्ण एनिमेशन और स्टेट मशीन यहां देखें।
बधाई हो 🥳, हमने अपने तत्व को सफलतापूर्वक एनिमेटेड कर दिया है और इसे एक स्टेट मशीन के साथ स्थापित कर दिया है! हालाँकि, रिव फ़ाइल को निर्यात करने से पहले, हम पृष्ठभूमि और चरित्र की शर्ट के रंग बदल देंगे। यह इस तरह दिखेगा👇🏽
पृष्ठभूमि का रंग (#B581EB) है और पात्र की शर्ट का रंग (#BD08D7) है
सब कुछ विस्तार से देखने के लिए एनीमेशन का लिंक यहां दिया गया है
हम इस एनिमेशन का उपयोग अपने लॉगिन पेज पर करेंगे। फ़्लटर ऐप प्रोजेक्ट बनाएं और Rive निर्भरता को pubspec.yaml
में जोड़ें
dependencies: rive: ^0.11.12
साथ ही, निर्यात की गई Rive फ़ाइल को अपनी प्रोजेक्ट संपत्तियों में जोड़ें। अब हम अपने डिज़ाइन के आधार पर यूआई बनाने के लिए आगे बढ़ सकते हैं। हमारा लक्ष्य है कि एनीमेशन निम्नलिखित कार्य करे:
हम विजेट बिल्ड फ़ंक्शन से पहले कुछ चीजों को परिभाषित करेंगे।
///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
फ़ंक्शंस में, हम देखते हैं कि श्रोताओं को जोड़ा और हटाया जाता है। श्रोता फ़ोकस परिवर्तन को सुनने के आदी हैं।
आप यूआई के लिए कोड और बाकी कोड यहां देख सकते हैं। कोड का यह भाग दिखाता है कि 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 चैनल भी देख सकते हैं।
यहाँ भी प्रकाशित किया गया है.