Animasyonlar genellikle bir uygulamanın veya web sitesinin görsel çekiciliğini artırır ve kullanıcıların genel katılımını artırır. Forrester Research tarafından yapılan bir araştırmaya göre, iyi hazırlanmış animasyonlara sahip web siteleri, kullanıcı etkileşiminde %400'e kadar artış sağlıyor. İlgi çekici animasyonlar kullanıcıların dikkatini çekebilir ve onları platformla daha fazla etkileşime girmeye teşvik edebilir. Ancak geliştiricilerin, özellikle daha gelişmiş animasyon araçları ve teknikleriyle çalışırken, animasyonda uzmanlaşmaları için bir öğrenme eğrisi vardır.
Animasyon konusunda hiçbir deneyimi olmayan bir geliştirici olarak Rive'ı kavramak, diğer animasyon araçlarına veya çerçevelerine kıyasla nispeten kolay olabilir. Rive (eskiden Flare olarak biliniyordu), kullanıcı dostu olacak ve önceden animasyon deneyimi çok az olan veya hiç olmayan geliştiriciler için bile erişilebilir olacak şekilde tasarlandı. Bu makalede, basit ve etkileyici Rive animasyonlarını kolaylıkla nasıl oluşturacağınızı ve bunları Flutter uygulamanızda nasıl yöneteceğinizi öğreneceksiniz.
Rive'a Giriş🧙♂️
Basit Bir İnteraktif Giriş Animasyonu🚀
Sonuç🏋️♀️
Referanslar🧶
Rive, geliştiricilerin ve tasarımcıların mobil uygulamalar, web uygulamaları ve oyunlar da dahil olmak üzere çeşitli platformlar için çarpıcı ve etkileşimli animasyonlar oluşturmasına olanak tanıyan güçlü ve kullanıcı dostu bir animasyon aracı ve çalışma zamanı motorudur.
İşte temel kavramlar:
Basit bir giriş animasyonu oluşturma ve bunu Flutter uygulamamıza aktarma sürecini gerçekleştireceğiz. Bu animasyonun uygulamadaki etkileşimini yönetmek için StateMachine'i kullanacağız. Sonunda şöyle görünmeli 👇🏽
Öğeyi Rive çalışma yüzeyinde ayarlamak için aşağıdaki adımları izleyin:
Daha sonra kemiklerimizi bağlayıp tartacağız. Bağlama, bir kemik hareket ettiğinde karakterin yüzeyinin karşılık gelen bölümlerinin de buna göre hareket etmesini sağlayarak deformasyon yanılsaması yaratır. Köşe ağırlığı olarak da bilinen ağırlıklandırma, karakterin ağının her köşesine, belirli kemiklere olan yakınlığına bağlı olarak etki değerleri (ağırlıklar) atamayı içerir. Bağlayacağımız şeklin yoluna gideceğiz. Boyun için ise bu şekilde boyun kemiğine bağlıyoruz.
Kemikleri bağladıktan sonra onlara ağırlıklar atayarak köşeleri belirliyoruz. Burada, son köşe kümesini %50'ye koyduğumuza dikkat edin, çünkü iki kemiğin onlar üzerinde %50 etkiye sahip olmasını istiyoruz. Özellikle ayarlanan köşeler iki kemiği etkileyen bir bölümü kapsıyorsa %50'yi kullanmalısınız. Şimdi aynısını saç yolu için de yapacağız. Saçta istediğimiz akıcı hareketi elde etmemize yardımcı olmak için sol ve sağ kemikleri de bir yerine iki kemik olarak değiştireceğiz.
Bu animasyonda göz kırpma efekti yapmak isterdik, bunun için iki göz şekli üzerinde klip özelliğini bu şekilde kullanacağız 👇🏽
Daha sonra, animasyon sırasında kafayı hareket ettirmek istediğimiz için bu öğeye çeviri kısıtlamalarını kullanarak kafa izlemeyi ekleyeceğiz. 2 boyutlu bir öğe olduğundan, çeviri kısıtlamalarının eklenmesi ona derinlik ve bir çeşit 3 boyutlu efekt verecektir. Her şeyi seçin ve gruplayın. Artık tek bir grubumuz var.
Daha sonra sol üst köşedeki grup aracını seçin ve kafanın ortasında (burun bölgesinde) bir grup oluşturun. Sağdaki araç çubuğunda stilini gruptan hedefe değiştirin, ctrl_front olarak adlandırın, çoğaltın ve kopyalananı ctrl_back olarak adlandırın.
ctrl_back hedefi için sağdaki araç çubuğundan kısıtlamalar seçeneğini seçin. Mevcut kısıtlama seçenekleri listesinden çeviri kısıtlamalarını seçin. Özelliklerini ayarlamak için seçilen kısıtlama seçeneğinden önceki simgeye tıklayın.
Gücü -100 olarak ayarlayın ve hedefini ctrl front olarak ayarlayın. Artık ctrl öne doğru hareket ettirildiğinde ctrl back ters yönde hareket eder. Yüzün kulaklar gibi ters yönde hareket etmesi gereken kısımlarına sınırlamalar getirmemize yardımcı olacaktır. Şöyle görünmeli 👇🏽
Şimdi yüzün geri kalanı için kısıtlamalar koyacağız. Ayrıca, onları daha iyi yönetmemize yardımcı olmak için gözleri (sol ve sağ) ve kulakları (sol ve sağ) gruplandıracağız. Gözlere böyle kısıtlamalar koyacağız 👇🏽
Grup | Kısıtlama gücü | Başlangıç konumu | Hedef |
---|---|---|---|
gözlük | %5 | ctrl_front kökeni ile aynı | ctrl_front |
kaşlar | %10 | ctrl_front kökeni ile aynı | ctrl_front |
kulaklar | %5 | kökeni ayarlamaya gerek yok | ctrl_back |
burun | %5 | ctrl_front kökeni ile aynı | ctrl_front |
yüz | %5 | ctrl_front kökeni ile aynı | ctrl_front |
Dudaklar için kısıtlamalar koymamıza gerek yok.
Tüm kısıtlamalarımızı eklemeyi bitirdikten sonra böyle görünüyor 👇🏽
💃🏽 🥳 Tebrikler, elementimizi ulaşmak istediğimiz animasyon türüne başarıyla hazırladık. Vay!!
Animasyon arayüzüne geçmek için sağdaki araç çubuğunda Canlandır düğmesini tıklayın. Altı animasyon zaman çizelgesi oluşturacağız ve her şeyi bir durum makinesine bağlayacağız. Zaman çizelgesinde, daha önce kemikler ve kısıtlamalarla ayarladığımız şeyleri kullanarak, elde etmek istediğimiz animasyonu oluşturmak için ana kareleri ayarlayabiliriz.
İlk zaman çizelgesi animasyonu boşta kalma animasyonudur. Animasyonun Boşta durumu olacaktır. Animasyonlu öğe devrede olmadığında bunu kullanacağız.
Bu boş animasyon için nefes alma, hafif saç hareketi ve göz kırpma illüzyonu yaratacağız. Boyun kemiğini, saç kemiklerini ve sağ/sol göz öğelerini kullanarak gerekli anahtar kareleri farklı pozlarda ayarlayacağız; bu, seçilen öğenin belirli özelliklerini zaman çizelgesindeki noktalara ayarlayabileceğimiz anlamına geliyor. Bir anahtar kareden diğerine geçiş stilini göz önünde bulundurarak ihtiyacımız olan enterpolasyon türünü seçeceğiz. Bunu Zaman Çizelgesi bölümünün sağ alt kısmında bulabilirsiniz. Bir anahtar kareden diğerine nasıl geçmek istediğinize bağlı olarak enterpolasyon tutma, doğrusal veya eğri olabilir. Şöyle görünecek 👇🏽
Yukarıdaki gif'ten, zaman çizelgesindeki farklı anahtar karelerde, seçilen öğeler için farklı pozlar ayarladığımızı fark edebilirsiniz. Bir anahtar kareden diğerine bu geçiş, animasyonu oluşturur. Aynı prosedürü kullanarak diğer beş zaman çizelgesini yaratacağız. Bu animasyonu görmek ve farklı zaman çizelgelerini detaylı olarak incelemek için buraya tıklayabilirsiniz. Şöyle görünüyor 👇🏽
Bu animasyon sürecinin son kısmına geldik. Durum makinesi, animasyonu bağlamanın görsel bir yoludur. Durum makinesini kullanarak ayarladığımız girdiye göre hangi animasyonun oynatılacağını kontrol edebiliriz. İki veya daha fazla zaman çizelgesi animasyonunu aynı anda oynatılacak şekilde karıştırabilir veya harmanlayabiliriz. Durum makinesinde doğru türdeki girişleri seçmeliyiz çünkü uygulamadaki animasyonu kontrol etmek için kullanacağımız şey budur.
Durum makinesinde üç tür girdimiz vardır:
Animasyon panelinde artı düğmesini tıklayın ve bir Durum makinesi oluşturun. Buna Oturum Açma Durumu Makinesi adını vereceğiz. Bu isim önemlidir çünkü kodda daha sonra durum makinemizi tanımlamak için ihtiyacımız olan isim budur.
Durum makinenizi kurmak için aşağıdaki adımları izleyin:
Artık durum makinesindeki animasyonun tamamı şu şekilde görünecek 👇🏽
Animasyonun tamamına ve Durum makinesine buradan göz atın.
Tebrikler 🥳, elementimizi başarılı bir şekilde canlandırdık ve state machine ile kurduk! Ancak rive dosyasını dışa aktarmadan önce arka planı ve karakterin gömlek renklerini değiştireceğiz. Şöyle görünecek👇🏽
Arka plan rengi (#B581EB) ve karakterin gömlek rengi (#BD08D7)
Her şeyi ayrıntılı olarak görmek için animasyonun bağlantısı burada
Bu animasyonu Giriş sayfamızda kullanacağız. Bir Flutter uygulama projesi oluşturun ve Rive bağımlılığını pubspec.yaml
dosyasına ekleyin
dependencies: rive: ^0.11.12
Ayrıca dışa aktarılan Rive dosyasını proje varlıklarınıza ekleyin. Artık tasarımımıza göre kullanıcı arayüzünü oluşturmaya devam edebiliriz. Animasyonun aşağıdakileri yapmasını hedefliyoruz:
Widget Build fonksiyonundan önce ilk olarak bazı şeyleri tanımlayacağız.
///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); }
Burada şunları not edebiliriz:
emailFocus
ve passwordFocus
işlevlerinde, kontrol girişi, FocusNode.hasFocus
boole değerine göre değiştirilir.initState
ve dispose
fonksiyonlarında Dinleyicilerin eklendiğini ve kaldırıldığını görüyoruz. Dinleyiciler odak değişimini dinlemek için kullanılır.
Kullanıcı arayüzü kodunu ve kodun geri kalanını buradan kontrol edebilirsiniz. Bu kod parçası RiveAsset'in nasıl ekleneceğini gösterir:
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"); }, ), ),
Yukarıdaki koddan şunları not edebiliriz:
Oturum açma işlevinin kodu aşağıdadır:
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; }); }
Kodun tamamını buradan inceleyin.
Bunu yaparak Giriş animasyon kodumuzu tamamlamış oluyoruz. Her şey şu şekilde görünüyor:
Tebrikler! Bu basit etkileşimli giriş animasyonunu tamamladık. İşte başarabildiğimiz her şeye genel bir bakış:
Bu öğreticiyi adım adım takip ettiğinizde birkaç darboğazla karşılaşabilirsiniz, ancak pratik yaptıkça bu daha da kolaylaşacaktır. Bu eğitimi takip ederken yardıma ihtiyacınız olursa bana Twitter'dan ulaşabilir veya yorum yapabilirsiniz.
Rive animasyonunu daha iyi kavramak için bu video eğitimlerine göz atın
Rive animasyonlarıyla ilgili çeşitli video eğitimleri için Rive kanalına da göz atabilirsiniz.
Burada da yayınlandı.