Az animációk egyszerűsítése a Flutterben implicit módon animált widgetekkel
A Flutterben elég könnyű animációkat készíteni, és sok komplexitást lehet elérni sokkal kevesebb erőfeszítéssel, mint a natív Androidban. Ez általában olyan módszerekkel érhető el, mint például egy Animation + egy AnimationController definiálása. De vannak beépített widgetek, amelyek még ezt is csökkentik, és az animációkat olyan egyszerűvé teszik, mint az értékek egyszerű megváltoztatása!
A teljes példák a cikk végén megadott Github oldalamon lesznek elhelyezve.
Egy AnimatedContainer automatikusan átvált a definiált értékekre (színek, méretek stb.) ahelyett, hogy csak úgy azonnal átváltana rájuk. A fenti GIF egy példa egy AnimatedContainerre.
Egy AnimatedContainer a következőképpen definiálható:
var myColor = Colors.blue;
var myHeight = 100.0;
var myWidth = 100.0;AnimatedContainer(
duration: Duration(seconds: 1),
color: myColor,
height: myHeight,
width: myWidth,
),
Rendes esetben egy vezérlőt és egy Tween<double> és egy ColorTween-t definiálnánk a fenti GIF-ben látható animáció eléréséhez. De az AnimatedContainerrel csak annyit kell tenned, hogy:
- Meghatározod az animáció időtartamát
duration: Duration(seconds: 1),
2. Megváltoztatod az értékeket (Szín és méret megváltoztatása az értékeidre)
myColor = Colors.green;
myHeight = MediaQuery.of(context).size.height;
myWidth = MediaQuery.of(context).size.width;
3. SetState()
setState(() {});
Nincs vezérlő. Nincs Tweens.
Amikor megváltoztatja a myColor, my Height vagy myWidth és a setState() értékeit, a konténer automatikusan átvált az értékekre, ahelyett, hogy közvetlenül az adott értékre váltana.
onPressed: () {
myColor = Colors.green;
myHeight = MediaQuery.of(context).size.height;
myWidth = MediaQuery.of(context).size.width;
setState(() {});
}
Az elején a myColor Colors.blue értékre volt állítva. Amikor megváltoztatjuk Colors.green-re, és a setState funkcióval újra felépítjük, a kékről zöldre vált át, anélkül, hogy bármilyen Tweent használnánk. (Megjegyzés: A Tweens implicit módon használatos, de nem kell felhasználó által definiálni.)
Az általam látottak alapján úgy tűnik, hogy sok fejlesztő nincs tisztában ezekkel az implicit módon animált widgetekkel, és időt pazarolnak, amikor nincs rá szükség. Nyilván lesznek olyan esetek, amikor másfajta viselkedést szeretnél, de a legtöbbször az AnimatedContainer elvégzi a dolgát.
Hero animációk
AnimatedOpacity animálja az átlátszóság változását, ill.Vagyis, hogy mennyire látható egy widget. A 0 opacitás teljesen átlátszóvá teszi a widgetet, míg az 1 opacitás teljesen láthatóvá teszi.
Az AnimatedOpacity a következőképpen van deklarálva:
AnimatedOpacity(
opacity: // Your variable holding opacity value,
duration: // Duration of the transition,
child: FlutterLogo(),
)
Az előző widgetekhez hasonlóan az AnimatedOpacity-ben is megváltoztatjuk az opacitást és a setState-et, és az automatikusan animálja az opacitásváltozást.
A fenti példában így van deklarálva:
AnimatedOpacity(
child: FlutterLogo(size: 100.0,),
opacity: myOpacity,
duration: Duration(seconds: 1),
),
A gombra kattintáskor egyszerűen megváltoztatja az opacitást és beállítja az állapotot.
onPressed: () {
myOpacity = 0.0;
setState(() {});
},