Sobes.tech
Middle

Jak vybrat vhodný způsob implementace animací v aplikaci Flutter?

sobes.tech AI

Odpověď od AI

Výběr závisí na složitosti animace, její frekvenci a míře interakce s uživatelem.

Hlavní způsoby:

  • ImplicitlyAnimatedWidgets: Jednoduché přechodové animace pro změnu vlastností widgetů (velikost, barva, průhlednost). Automaticky animují změny vlastností.
    // Příklad AnumatedContainer
    AnimatedContainer(
      duration: const Duration(seconds: 1),
      width: _size,
      height: _size,
      color: _color,
      alignment: Alignment.center,
      curve: Curves.fastOutSlowIn,
      child: const FlutterLogo(size: 75),
    );
    
  • AnimatedBuilder a AnimationController: Pro složitější a uživatelsky definované animace. Vyžadují explicitní řízení animace přes AnimationController a překreslení widgetu pomocí AnimatedBuilder.
    // Příklad RotationTransition s AnimationController
    class RotatingSquare extends StatefulWidget {
      @override
      _RotatingSquareState createState() => _RotatingSquareState();
    }
    
    class _RotatingSquareState extends State<RotatingSquare> with SingleTickerProviderStateMixin {
      late AnimationController _controller;
      late Animation<double> _animation;
    
      @override
      void initState() {
        super.initState();
        _controller = AnimationController(
          duration: const Duration(seconds: 2),
          vsync: this,
        )..repeat(); // Opakuje animaci
    
        _animation = CurvedAnimation(
          parent: _controller,
          curve: Curves.linear, // Lineární křivka
        );
      }
    
      @override
      void dispose() {
        _controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return RotationTransition( // Widget pro rotaci
          turns: _animation,
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
          ),
        );
      }
    }
    
  • AnimatedWidget: Abstraktní třída pro tvorbu znovupoužitelných animovaných widgetů. Zjednodušuje tvorbu widgetů závislých na AnimationController.
    // Příklad ScaleTransition (dědí z AnimatedWidget)
    ScaleTransition(
      scale: _animation,
      child: const FlutterLogo(size: 75),
    );
    
  • Hero animace: Animace přechodu mezi obrazovkami, kdy stejný widget "létá" z jedné obrazovky na druhou.
    // Na první obrazovce
    Hero(tag: 'logo', child: FlutterLogo(size: 50));
    
    // Na druhé obrazovce
    Hero(tag: 'logo', child: FlutterLogo(size: 200));
    
  • CustomPaint: Pro kreslení vlastních grafik a jejich animaci. Vyžaduje hlubší znalosti kreslení na plátně.

Srovnávací tabulka:

Metoda Složitost Kontrola nad animací Použití
ImplicitlyAnimatedWidgets Nízká Omezená Jednoduché změny vlastností
AnimatedBuilder/Controller Střední Plná Složitější/vlastní animace
AnimatedWidget Střední Plná Znovupoužitelné animované widgety
Hero animace Nízká Omezená Přechody mezi obrazovkami
CustomPaint Vysoká Plná Vlastní grafika

Zvolte nejjednodušší metodu, která splňuje požadavky na animaci. Pro jednoduché případy jsou vhodné ImplicitlyAnimatedWidgets. Pro složitější a vlastní scénáře použijte AnimatedBuilder s AnimationController. Hero pro přechody, CustomPaint pro složitou grafiku.