Sobes.tech
Back to questions
Middle
119
questionbank

Расскажите о анимации в 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.

Типы анимации:

  1. Неявная анимация (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),
    );
    
  2. Явная анимация (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.

Выбор метода анимации зависит от сложности требуемой анимации. Для простых случаев достаточно неявной анимации, для более сложных и кастомных — явная анимация.