ایجاد انیمیشن اسکرول در فلاتر (Flutter) – از صفر تا صد
در این مقاله نگاهی به شیوه ساخت انیمیشنهای اسکرول سفارشی از صفر تا صد با استفاده از SDK فلاتر خواهیم داشت. فلاتر یک ابزار پرقدرت برای ایجاد اپلیکیشنهای نیتیو موبایل است که به صورتی عالی اجرا میشوند و انعطافپذیری خارقالعادهای در زمینه خلق تجربیات کاربری غنی فراهم میسازد.
اگر به محیط فلاتر دسترسی ندارید به صفحه نصب (+) آن بروید.
شروع
در دمویی که در این مقاله میخواهیم بسازیم یک پروژه پیشفرض با استفاده از دستور flutter create ایجاد میکنیم و تنها از کلاسهایی استفاده میکنیم که مستقیماً درون فلاتر وجود دارند و لذا نیاز به افزودن هیچ وابستگی به پروژه نداریم. در اغلب موارد، یک وظیفه (مانند انیمیشن سفارشی) میتواند مستقیماً و بدون نیاز به کتابخانههای اضافی اجرا شود.
ایده اصلی این اپلیکیشن نمونه، ایجاد یک نمای لیستی ساده با چند آیتم است و زمانی که این نما به سمت پایین اسکرول میشود، در پسزمینه یک چرخدنده در جهتهای ساعتگرد یا پادساعتگرد میچرخد. این کار با کمک گرفتن از کنترلر اسکرول روی نمای لیستی و ارسال یک پسزمینه انیمیشنی به آن صورت میگیرد که یک ویجت سفارشی میسازد که همگام با موقعیت اسکرول به چرخش درمیآید.
نقطه ورود اپلیکیشن
کار خود را با فایل اصلی اپلیکیشن یعنی lib/main.dart آغاز میکنیم:
در فایل main.dart، برخی دستورهای ایمپورت برای کامپوننتهای زیر وجود دارند:
- demo-card.dart – یک ویجت کارت از یک آیتم میسازد.
- items.dart – کلاس آیتم را تعریف کرده و محتوایی برای اپلیکیشن دمو ایجاد میکند.
- animated-bg.dart – ویجت پسزمینه انیمیشنی را میسازد.
کلاس اپلیکیشن اصلی (AnimationDemo) یک اپلیکیشن ابتدایی میسازد که ویجت صفحه اصلی پیشفرض (MyHomePage) را پوشش میدهد. در کلاس MyHomePage یک مشخصه به نام controller_ وجود دارد که به یک وهله جدید از کلاس ScrollController مقداردهی میشود تا در ادامه به هر دو کامپوننت AnimatedBackground و ListView ارسال شود. کامپوننت AnimatedBackground به چرخاندن چرخ رنده در پسزمینه میپردازد و ListView نیز لیست اسکرول شونده از آیتمهای دمو را رندر میکند. یک مشخصه به نام cards_ نیز وجود دارد که با لیستی از اشیای Item آغاز میشود که از items.dart ایمپورت شدهاند و لیستی از ویجتهای DemoCard برای رندر شدن در ListView بازگشت میدهد.
کلاس Item
نخستین فایل ایمپورت شده که به بررسی آن میپردازیم فایل lib/items.dart است:
کلاس Item ساختمان دادهای را ارائه میکند که همراه با وهلهای از DemoCard ارسال میشود تا در ListView رندر شود. در این مورد چیز خاصی زیادی برای تنظیم به جز یک نام، توضیح (که در حال حاضر در دمو بیاستفاده است)، رنگ و آیکون برای رندر شدن هر آیتم وجود ندارد. لیستی از اشیای آیتمها به عنوان لیستی از محتوای ساده ارائه میشود که درون ListView رندر میشوند.
کلاس DemoCard
فایل بعدی که بررسی میکنیم lib/demo-card.dart نام دارد:
کلاس DemoCard در سازنده خود یک آیتم دریافت میکند و یک ویجت کارت بازگشت میدهد که عناصر Text و Icon را رندر میکند که به نمایش نام و آیکون تعریفشده برای هر آیتم میپردازند. برخی استایلبندیهای ساده نیز با استفاده از Shadow ،TextStyle و RoundedRectangleBorder همراه با ارتفاع کارت (که روی 3 تنظیمشده) اعمال میشوند. ویجتهای Column و Row برای گسترش عناصر فرزند روی کارت استفاده میشوند.
کلاس AnimatedBackground
ما بهترین بخش کار را برای انتها نگه داشتهایم. بنابراین در این بخش به بررسی فایل lib/animated-bg.dart میپردازیم:
در همان ابتدای فایل، کتابخانه dart:math ایمپورت شده تا به ثابت π دسترسی پیدا کنیم که برای اجرای محاسبات تبدیل چرخشی برای گردش چرخدنده مورد نیاز است. سازنده کلاس AnimatedBackground یک مقدار ScrollController میگیرد که اقدام به اجرای چرخش میکند. مشخصه offset_ در صورتی که کنترلر کلاینتهایی داشته باشد یعنی کنترلر به درستی مقداردهی شده باشد و به یک عنصر اسکرول شنونده واقعی مانند ListView قلاب شده باشد یک آفست بازگشت میدهد و در غیر این صورت مقدار صفر بازمیگرداند. متد build یک AnimatedBuilder بازگشت میدهد که کنترلر را میگیرد و یک OverflowBox میسازد که همراستا با چرخدنده و خارج از صفحه جای میگیرد.
مقادیر 4 و 3 موجب میشوند که چرخدنده در گوشه پایین-چپ دستگاه تست که یک شبیهساز آیفون XR است، قرار گیرند. در عمل مقادیر Alignment باید از مختصات عرض و ارتفاع صفحه دستگاه محاسبه شوند تا مقادیر دقیقی برای قرار گرفتن چرخدنده در موقعیت مطلوب در هر دستگاه به دست آید. با این حال ما در این مثال تلاش کردهایم همه چیز تا حد امکان ساده باشد.
آخرین بخش جایی است که خود انیمیشن در آن اتفاق میافتد و این همان متد استاتیک rotate در کلاس است. این کلاس یک مقدار angle و یک child میگیرد و فرزند به وسیله زاویه مورد نظر به چرخش درمیآید. در این دمو ما میخواهیم که چرخدنده به آرامی حرکت کند و بیشتر به فیزیک واقعی شبیه باشد تا چرخش سریع دیوانهوار که در زمان تعیین مقدار چرخش 1:1 به دست میآید. همچنین میخواهیم چرخدنده در جهت پادساعتگرد بچرخد، گرچه از نظر فیزیکی لیست را به حرکت درمیآورد بنابراین offset را در math.pi ضرب کرده و سپس حاصلضرب را بر 1024- تقسیم میکنیم.
سخن پایانی
این مقاله و پروژه نمونه صرفاً برخی از قابلیتهایی که فلاتر برای ایجاد تجربیات کاربری متحرک سفارشی ارائه میکنند را نشان دادند. ما با استفاده از تنها چند کلاس ابتدایی و مسیر ساده، یک انیمیشن کامل داریم که یک عنصر کاملاً ملالآور مانند صفحه تنظیمات را به چیزی کاملاً جذاب تبدیل میکند.
این مفاهیم میتوانند برای ایجاد «صفحههای آغازین» (splash screens)، انیمیشنهای بارگذاری، گذار صفحه، جلوههای نوتیفیکیشن یا هر چیز دیگری مورد استفاده قرار گیرند. تقریباً هر چیزی که یک مقدار Double به عنوان آرگومان میگیرد میتواند انیمیت شود و در نتیجه پیادهسازی سرراستی از جلوههای مختلف مانند چرخش در این مثال به دست میآید. همچنین میزان شفافیت، موقعیت و بسیاری مشخصههای دیگر نیز قابل تنظیم هستند.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما توصیه میشوند:
- مجموعه آموزشهای برنامهنویسی اندروید
- مجموعه آموزشهای برنامهنویسی
- گوگل فلاتر (Flutter) از صفر تا صد — ساخت اپلیکیشن به کمک ویجت
- مفاهیم مقدماتی فلاتر (Flutter) — به زبان ساده
- آموزش فلاتر (Flutter): توسعه اپلیکیشن برای صفحات نمایش با ابعاد مختلف
==