Stagger Animation

تعداد بازدید ها : 495 بازدید
 Stagger Animation

Stagger Animation یکی از قابلیت های بسیار زیبا و کاربردی فلاتر است . توسط Stagger Animation شما قادر خواهید بود انیمیشن های ترکیبی و زیبایی را خلق نمایید . در واقع Stagger Animation به شما این امکان را می دهد که تعدادی انیمیشن را در یک دسته قرار داده و به ترتیب اجرا نمایید .

Stagger Animation در واقع یک تکنیک است . تکنیکی که به شما این امکان را می دهد با یکبار صدور فرمان شروع انیمیشن ، بتوانید تعداد زیادی انیمیشن را به ترتیب ، اجرا نمایید . ترتیب اجرای انیمیشن ها مقیاسی بین عدد ۰ تا ۱ است به طوری که این بازه عددی به ۱۰۰۰ قسمت تقسیم شده است و شما می توانید تعیین کنید هر انیمیشن شما چه سهمی از این ۱۰۰۰ قسمت را داشته باشد . در ادامه وقتی مدت اجرای انیمیشن را در خصوصیت duration کنترلر تعریف کردید ، کامپایلر به صورت خودکار مقیاس تعیین شده بین ۰ و ۱ را به مدت اجرای انیمیشن تبدیل و انیمیشن را بر اساس آن اجرا می نماید .

قطعه کد زیر نمونه از پیاده سازی Stagger Animation به نمایش گذاشته است :

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    home: StaggerAnimationDemo(),
  ));
}

class StaggerAnimationDemo extends StatefulWidget {
  @override
  _StaggerAnimationDemoState createState() => _StaggerAnimationDemoState();
}

class _StaggerAnimationDemoState extends State<StaggerAnimationDemo>
    with SingleTickerProviderStateMixin {
  AnimationController controller; //  گام اول : تعریف یک کنترلر

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    // گام دوم : مقداردهی به کنترلر
    controller = new AnimationController(
        vsync: this, duration: Duration(milliseconds: 2000));
  }

  @override
  void dispose() {
    // جهت بهینه شدن استفاده از حافظه
    controller.dispose(); // توقف انیمیشن در صورت خروج از این اسکرین

    super.dispose();
  }

  // گام سوم : فراخوانی تابع اجرای انیمیشن
  _playAnimation() async {
    try {
      await controller.forward();
      await controller.reverse();
    } on TickerCanceled {}
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Stagger Animation'),
        centerTitle: true,
      ),
      body: GestureDetector(
        onTap: () {
          _playAnimation();  // فراخوانی اجرای انیمیشن
        },
        child: Center(
          child: Container(
            width: 300,
            height: 400,
            decoration: BoxDecoration(
              color: Colors.black.withOpacity(0.1),
              border: Border.all(
                color: Colors.black.withOpacity(0.5),
              ),
              borderRadius: BorderRadius.all(Radius.circular(15)),
            ),
            child: StaggerAnimation(
                // چون مایل نیستم تابع من روی کنترلر تغییر ایجاد کند فقط ویویی از کنترلر را به آن ارسال می کنم
                controller: controller.view),
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _playAnimation();  // فراخوانی اجرای انیمیشن
        },
        child: Icon(Icons.play_arrow),
      ),
      bottomNavigationBar: BottomAppBar(
        color: Theme.of(context).primaryColor,
        shape: CircularNotchedRectangle(),
        notchMargin: 8,
        child: Container(
          height: 55,
        ),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
    );
  }
}

class StaggerAnimation extends StatelessWidget {
 
  final Animation<double> controller; // انیمیشن اصلی دریافت کننده کنترلر 
  final Animation<double> opacity; // انیمیشن کنترل کننده میزان شفافیت
  final Animation<double> width; // انیمیشن کنترل کننده عرض ویجت
  final Animation<double> height; // انیمیشن کنترل کننده ارتفاع ویجت
  final Animation<EdgeInsets> padding; // انیمیشن کنترل کننده فاصله از داخل
  final Animation<BorderRadius> borderRadius; // انیمیشن کنترل کننده گردی گوشه های حاشیه
  final Animation<Color> color; // انیمیشن کنترل کننده رنگ ویجت

  StaggerAnimation({@required this.controller}) // سازنده کلاس
      : // مقداردهی اولیه به سایر انیمیشن ها
        opacity = Tween<double>(begin: 0.0, end: 1.0).animate(new CurvedAnimation( 
            // اتصال این انیمیشن با انیمیشن اصلی که حاوی کنترلر هست توسط خصوصیت Parent
            parent: controller,
            curve: new Interval(0.0, 0.150, curve: Curves.ease))),
        width = Tween<double>(begin: 50.0, end: 200.0).animate(new CurvedAnimation(
            parent: controller,
            curve: new Interval(0.150, 0.350, curve: Curves.ease))),
        height = Tween<double>(begin: 50.0, end: 200.0).animate(new CurvedAnimation(
            parent: controller,
            curve: new Interval(0.350, 0.500, curve: Curves.ease))),
        padding = EdgeInsetsTween(
                begin: const EdgeInsets.only(bottom: 16),
                end: const EdgeInsets.only(bottom: 150))
            .animate(new CurvedAnimation(
                parent: controller,
                curve: new Interval(0.350, 0.500, curve: Curves.ease))),
        borderRadius = BorderRadiusTween(
                begin: BorderRadius.circular(5), end: BorderRadius.circular(100))
            .animate(new CurvedAnimation(
                parent: controller,
                curve: new Interval(0.500, 0.700, curve: Curves.ease))),
        color = ColorTween(begin: Colors.indigo[100], end: Colors.orange[400])
            .animate(new CurvedAnimation(
                parent: controller,
                curve: new Interval(0.700, 0.999, curve: Curves.ease)));

  // تابع سازنده ویجت
  @override
  Widget build(BuildContext context) {
    // ایجاد انیمیشن بیلدر
    return AnimatedBuilder(
      animation: controller,  // تعیین کنترلر
      builder: buildAnimation,  // تعیین ویجت مورد نظر جهت اجرای انیمیشن
    );
  }

  // ایجاد ویجتی که توسط انیمیشن بیلدر کنترل خواهد شد
  Widget buildAnimation(BuildContext context, Widget child){
    return Container(
      padding: padding.value,
      alignment: Alignment.bottomCenter,
      child: Opacity(
        opacity: opacity.value,
        child: Container(
          width: width.value,
          height: height.value,
          decoration: BoxDecoration(
              color: color.value,
              border: Border.all(color: Colors.indigo[300], width: 3),
              borderRadius: borderRadius.value),
        ),
      ),
    );
  }
}

 

می خوانم   ویجت Text

خروجی کد فوق در تصویر زیر قابل مشاهده است :

Stagger_Animationممکن است در ابتدا درک کدهای این انیمیشن قدری سخت باشد ولی مطمئنا با قدری تمرکز و تمرین مسئله به سرعت ساده و قابل مفهم می گردد . در مثال بالا شما فقط کافیست روش تعریف ویجت مربوط به انیمیشن و روش مقداردهی به انیمیشن ها بر اساس کنترلر را متوجه شوید تا مسئله به سمت ساده شدن برود .

قطعه کد زیر (خط ۱۰۷ کد فوق ) نمونه ی ساده شده ای از روش مقدار دهی به یک انیمیشن را نشان می دهد :

width = Tween<double>(
             begin: 50.0,   // نقطه شروع انیمیشن
             end: 200.0   // نقطه پایان انیمیشن
          ).animate(
             new CurvedAnimation(
                 parent: controller,  // اتصال این انیمیشن به کنترلر
                 curve: new Interval(
                            ۰٫۱۵۰,  // لحظه شروع انیمیشن
                            ۰٫۳۵۰,  // لحظه پایان انیمیشن
                            curve: Curves.ease  // روش اجرای انیمیشن
                        )
              )
          ),

در کد فوق یک انیمیشن قرار است مقدار عرض یک ویجت را تغییر دهد . برای این منظور توسط Tween (به معنی : بین) اعلام شده که از begin:50 تا end:200 یعنی از عرض ۵۰ تا عرض ۲۰۰ انیمیشن تغییر ایجاد نماید . همچنین منحنی اجرای انیمیشن (CurvedAnimation) در خصوصیت animate تعیین شده است و به این روش به انیمیشن گفته ایم در فاصله زمانی ۰٫۱۵۰ تا ۰٫۳۵۰ ( یعنی ۲۰۰ سهم از ۱۰۰۰ سهم ) اجرا شود و روش اجرای انیمیشن نیز Curves.ease باشد . در این مثال انیمیشن ما دومین انیمیشنی است که اجرا خواهد شد ، چرا که از لحظه ۰٫۱۵۰ شروع شده است و قبل از این لحظه ، فقط یک انیمیشن وجود دارد .

جهت کسب اطلاعات بیشتر از این آدرس به سایت اصلی فلاتر مراجعه نمایید .

می خوانم   Widget چیست؟

امیدوارم این مطلب برای شما مفید باشد .

محمدمجتبی جوارشکیان

محمدمجتبی جوارشکیان

من محمدمجتبی جوارشکیان ، کارشناس IT و فعال اجتماعی هستم و در حوزه معماری ، طراحی ، تحلیل گری ، مدلسازی و توسعه ی محیط های نرم افزاری فعالیت دارم . بسیار خوشحال می شوم من را از انتقادات ، پیشنهادات و نظرات خود مطلع فرمایید . آدرس ایمیل : info@javareshkian.ir

ارسال یک پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

بیست + پانزده =