Расскажите о анимации в Flutter.
Sobes Copilot
Get answers in real time
Answer from AI
sobes.tech AI
В Flutter анимация строится на основе виджетов и контроллеров. Основные концепции:
- Tween: Определяет диапазон значений, между которыми происходит интерполяция (например, от 0.0 до 1.0 или от красного до синего).
- Animation: Абстрактный класс, представляющий значение, которое меняется со временем. Обычно создаётся с помощью
TweenиAnimationController. - AnimationController: Специальный
Animation, который управляет продолжительностью, направлением и состоянием анимации (запуск, остановка, пауза). ТребуетTickerProviderдля синхронизации с фреймами экрана. - Curve: Определяет скорость изменения значения анимации с течением времени (линейная, ускорение, замедление и т.д.). Применяется к
Animation.
Типы анимации:
-
Неявная анимация (Implicit Animation): Использует виджеты, которые автоматически анимируют свои свойства при их изменении. Простой способ создания анимации для базовых свойств. Пример:
AnimatedContainer,AnimatedOpacity,AnimatedCrossFade.// Пример AnimatedContainer AnimatedContainer( duration: const Duration(seconds: 1), width: _isExpanded ? 200.0 : 100.0, height: _isExpanded ? 100.0 : 200.0, color: _isExpanded ? Colors.blue : Colors.red, alignment: Alignment.center, curve: Curves.fastOutSlowIn, child: const FlutterLogo(size: 75), ); -
Явная анимация (Explicit Animation): Требует создания
AnimationControllerиAnimation. Даёт полный контроль над процессом анимации. Используется для более сложных сценариев, последовательных или параллельных анимаций.Основные виджеты для явной анимации:
-
AnimatedBuilder: Перестраивает только ту часть дерева виджетов, которая зависит отAnimation. Оптимизирует производительность, избегая полного перестроения.AnimationController _controller; Animation<double> _animation; @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(seconds: 2), vsync: this, // Needs TickerProviderStateMixin ); _animation = Tween<double>(begin: 0, end: 300).animate(_controller); } @override Widget build(BuildContext context) { return AnimatedBuilder( animation: _animation, builder: (BuildContext context, Widget? child) { return Container( width: _animation.value, height: _animation.value, color: Colors.blue, child: child, ); }, child: const Center(child: Text('Hello')), ); } @override void dispose() { _controller.dispose(); super.dispose(); } -
SlideTransition,FadeTransition,ScaleTransitionи другие: Виджеты, которые принимаютAnimationи применяют соответствующие преобразования к своемуchild.FadeTransition( opacity: _animation, // _animation is Animation<double> from 0.0 to 1.0 child: const FlutterLogo(size: 100), )
-
Типы TickerProvider:
SingleTickerProviderStateMixin: Используется, если только одинAnimationControllerнаходится в этомState.TickerProviderStateMixin: Используется, если несколькоAnimationControllerнаходятся в этомState.
Выбор метода анимации зависит от сложности требуемой анимации. Для простых случаев достаточно неявной анимации, для более сложных и кастомных — явная анимация.