Google Flutter from Scratch Widgets animeren

Animaties kunnen, wanneer correct gebruikt, een enorm verschil maken in hoe gebruikers uw app waarnemen. Een app met veel snelle, subtiele animaties heeft de neiging om er veel meer gepolijst en professioneel uit te zien dan een zonder. Op Google Play, een overvolle marktplaats, kan dat het verschil betekenen tussen succes en falen.

Flutter is misschien het enige hybride ontwikkelraamwerk dat vandaag beschikbaar is en waarmee je complexe animaties kunt maken die constant kunnen draaien met 60 frames per seconde. In deze tutorial help ik je de basisprincipes van het animeren van Flutter-widgets te begrijpen. Ik zal u ook een paar nieuwe widgets voorstellen die uw animatiecode kunnen vereenvoudigen.

1. Een widget voorbereiden op animatie

Het Flutter-raamwerk verwacht dat je een functionele, reactieve benadering van programmeren volgt. Daarom, om een ​​widget te kunnen animeren, moet u de staat ervan herhaaldelijk kunnen bijwerken, met goed getimede intervallen.

Als u een widget wilt maken die gemakkelijk te animeren is, maakt u eerst een klasse die de extensie verlengt StatefulWidget klasse en overschrijft het createState () methode. Zorg er binnen de methode voor dat u a Staat aanleg.

class MyApp breidt StatefulWidget uit @override State createState () return new MyState (); 

Om animeerbaar te zijn, moet het statusobject dat u aan uw stateful-widget koppelt, niet alleen de extensie verlengen Staat klasse, moet het ook een mixin gebruiken SingleTickerProviderStateMixin. Zoals de naam al doet vermoeden, biedt de mixin een Ticker object, dat herhaaldelijk callbacks genereert, gewoonlijk bekend als ticks. Omdat de ticks herhaaldelijk met uniforme intervallen worden gegenereerd, kunt u ze gebruiken om te bepalen wanneer de afzonderlijke frames van uw animatie worden gerenderd.

klasse MyState breidt State uit met SingleTickerProviderStateMixin @override Widget-build (BuildContext-context) // Meer code hier

2. Een Tween-animatie maken

Een tween-animatie is een van de eenvoudigste animaties die u kunt maken met Flutter. Terwijl u het maakt, hoeft u alleen maar twee verschillende waarden op te geven: een beginwaarde en een eindwaarde. Het framework genereert dan automatisch een set tussentijdse waarden - of tussenwaarden - die starten vanaf de startwaarde en vloeiend groeien om overeen te komen met de eindwaarde. Door deze tussentijdse waarden geleidelijk toe te passen op een eigenschap van uw widget, animeert u die eigenschap.

Laten we nu een eenvoudige tween-animatie maken die een widget verplaatst van de linkerbovenhoek van het scherm naar de rechterbovenhoek van het scherm. Met andere woorden, laten we het animeren links eigenschap van een widget.

Om de animatie te maken en te besturen, heb je een animatie object en een AnimationController voorwerp. Voeg ze toe als lidvariabelen van uw staat:

animatie animatie; AnimationController-controller;

U moet beide objecten initialiseren door de initState () methode van uw klas. Bel binnen de methode de constructor van de AnimationController klasse om de controller te initialiseren. Het verwacht een TickerProvider object als een van zijn ingangen. Omdat de staat al gebruik maakt van de SingleTickerProviderStateMixin mixin, je kan slagen deze ernaar toe. Bovendien kunt u de looptijd eigenschap om de duur van de animatie te specificeren.

Met de volgende code wordt een animatiecontroller gemaakt met een duur van vier seconden:

@override void initState () super.initState (); controller = nieuwe AnimationController (vsync: dit, duur: nieuwe duur (seconden: 4)); // Meer code hier

Op dit punt kunt u een maken Tween object dat de begin- en eindwaarden van uw animatie opgeeft.

Tween tween = nieuwe Tween(begin: 10.0, einde: 180.0);

Om de te associëren Tween object met de AnimationController object, je moet de zijn animeren () methode. De geretourneerde waarde van de methode is een animatie object, dat u kunt opslaan in de tweede lidvariabele van uw klas.

animatie = tween.animate (controller);

De animatie object genereert een animatiegebeurtenis voor elk vinkje van de ticker, die u moet afhandelen om uw animatie te laten werken. Om dit te doen, kunt u het gebruiken addListener () methode. Bovendien, binnen de gebeurtenishandler, moet u de setstate () methode om de status van je widget bij te werken en opnieuw te tekenen. De volgende code laat zien hoe:

animation.addListener (() setState (() ););

Merk op dat u geen code hoeft te schrijven binnen de setstate () methode, tenzij u andere statusvariabelen hebt om bij te werken.

Als laatste, om de animatie te starten, moet u de vooruit() methode van de animatiecontroller.

controller.forward ();

De animatie is klaar. Je hebt het echter nog steeds niet toegepast op een widget die op het scherm wordt getekend. Voor nu, stel ik voor dat je het toepast op een gepositioneerd widget met een materiaal Icoon widget. Om dit te doen, stelt u tijdens het maken van de widget eenvoudig de waarde ervan in links eigendom van de waarde eigendom van de animatie voorwerp.

Voeg daarom de volgende code toe, die de waarde overschrijft bouwen() methode, naar de staat:

@override Widget-build (BuildContext-context) retourneer nieuwe container (kleur: Colors.white, child: new Stack (kinderen: [new Positioned (child: new Material (child: new Icon (Icons.airport_shuttle, textDirection: TextDirection.ltr, size: 81.0)), links: animation.value, // Geanimeerde waarde top: 30.0 // Fixed value)], textDirection: TextDirection.ltr,)); 

Merk op dat er een is stack widget in de bovenstaande widgetboom omdat a gepositioneerd widget moet altijd in één worden ingesloten.

U kunt uw app nu uitvoeren om de animatie te bekijken.

 

3. Afhandeling van animatiestatusgebeurtenissen

Als u een melding wilt ontvangen wanneer uw animatie is beëindigd, kunt u een AnimationStatusListener bezwaar tegen uw animatie voorwerp. In de luisteraar, als de huidige animatiestatus is voltooid of ontslagen, je kunt er zeker van zijn dat de animatie is afgelopen.

Tween-animaties in Flutter zijn omkeerbaar. Dat is de reden waarom er twee verschillende statusconstanten zijn die het einde van een animatie aanduiden. Als de huidige status is voltooid, dit betekent dat de animatie is geëindigd aan de eindwaarde van de tween. Als het is ontslagen, dit betekent dat de animatie is geëindigd bij de startwaarde. Gebruik van de twee statussen en de vooruit() en omgekeerde() methoden, kunt u gemakkelijk heen en weer tussen animaties maken.

De volgende code, die u kunt toevoegen aan de initState () methode, laat u zien hoe u de animatie die u in de vorige stap hebt gemaakt, kunt omkeren en herhalen:

animation.addStatusListener ((status) if (status == AnimationStatus.completed) controller.reverse (); else if (status == AnimationStatus.dismissed) controller.forward (););

Als u de app opnieuw uitvoert, ziet u de animatie eindeloos herhalen.

 

4. Geanimeerde widgets gebruiken

Het Flutter-framework biedt enkele gemakkelijk animeerbare widgets die u kunt gebruiken om uw animatiecode iets minder breed en meer herbruikbaar te maken. Allemaal subklassen van de AnimatedWidget klasse en verwachten animatie of AnimationController objecten in hun constructors.

Een van de meest gebruikte geanimeerde widgets is de RotationTransition widget. Hiermee kunt u snel een rotatie-animatie toepassen op zijn kinderen. Om het te gebruiken, maakt u eerst een nieuwe animatiecontroller. De volgende code maakt een code waarvan de duur is ingesteld op zes seconden:

controller = nieuwe AnimationController (vsync: dit, duur: nieuw Duur (seconden: 6));

Om deze keer de animatie te starten, in plaats van de vooruit() methode, gebruik de herhaling() methode. Dit zorgt ervoor dat de animatie eindeloos wordt herhaald.

controller.repeat ();

Om dingen eenvoudig te houden, kunt u een Tekst widget als het kind van de RotationTransition widget. Dus maak dienovereenkomstig een widgetstructuur aan. Tijdens het maken van de RotationTransition widget, zorg er echter voor dat je de waarde ervan instelt bochten eigendom van de AnimationController object dat u zojuist hebt gemaakt. Optioneel kunt u beide widgets in een Centrum widget. Hier is hoe:

@override Widget-build (context BuildContext) return new Center (child: new RotationTransition (turns: controller, child: new Text ("\ u 1F43A", textDirection: TextDirection.ltr, style: new TextStyle (fontSize: 85.0) ,))); 

In de bovenstaande code heb ik een Unicode-emoji-codepunt gebruikt als de inhoud van de Tekst widget. Dit is toegestaan ​​omdat Flutter emoji direct uit de doos ondersteunt.

Wanneer u de app opnieuw uitvoert, ziet u iets als dit op uw scherm:

 

Zeer vergelijkbaar met de RotationTransition widget is de ScaleTransition widget. Zoals je misschien al geraden hebt, kun je hiermee de schaal van zijn kinderen animeren. Terwijl u het maakt, volstaat het om de AnimationController bezwaar tegen zijn schaal eigendom. De volgende code laat zien hoe u:

@override Widget-build (context BuildContext) return new Center (child: new ScaleTransition (schaal: controller, child: new Text ("\ u 1F43A", textDirection: TextDirection.ltr, style: new TextStyle (fontSize: 85.0) ,))); 

U kunt nu het Tekst widget schaalverandering tijdens de animatie.

 

Als je je afvraagt ​​waarom we er geen hebben gemaakt Tween objecten voor de bovenstaande animaties, omdat, standaard, de AnimationController klasse gebruikt 0.0 en 1.0 als de beginnen en einde waarden.

5. Gebruik Curves

Alle animaties die we in eerdere stappen hebben gemaakt, volgden een lineaire curve. Als gevolg hiervan zien ze er niet erg realistisch uit. Door de manier waarop de Tween object genereert tussentijdse waarden, u kunt dit wijzigen.

Flutter heeft een klasse genaamd CurvedAnimation, waarmee je niet-lineaire curves kunt toepassen op je tweens. Wanneer u het gebruikt met de curves klasse, die een verscheidenheid aan bochten biedt, zoals easeIn en easeOut, je kunt animaties creëren die natuurlijker aanvoelen.

Om een ​​te maken CurvedAnimation object, je hebt een AnimationController object als een ouder. U bent vrij om een ​​van de controllers te gebruiken die u in eerdere stappen hebt gemaakt of om een ​​nieuwe controller te maken. De volgende code maakt een nieuwe controller waarvan de duur is ingesteld op vijf seconden, en een CurvedAnimation object waarvan kromme eigenschap is ingesteld op a bounceOut kromme:

controller = nieuwe AnimationController (vsync: dit, duur: nieuwe duur (seconden: 5)); CurvedAnimation curvedAnimation = new CurvedAnimation (parent: controller, curve: Curves.bounceOut);

U kunt nu een maken Tween object en pas de CurvedAnimation bezwaar maken door het te noemen animeren () methode. Zodra de animatie gereed is, vergeet dan niet om een ​​luisteraar aan de animatie toe te voegen, de status bij te werken en vervolgens de vooruit() methode om het te starten.

Tween myTween = nieuwe Tween(begin: 150.0, einde: 450.0); animatie = myTween.animate (curvedAnimation); animation.addListener (() setState (() );); controller.forward ();

Laten we de animatie toepassen op a om de animatie te zien gepositioneerd widget top eigendom. Je bent vrij om een ​​onderliggende widget erin toe te voegen. In de volgende code voeg ik een toe Tekst widget die een andere emoji weergeeft.

@override Widget-build (context BuildContext) return new Stack (children: [new Positioned (child: new Text ("\ u 26BE", textDirection: TextDirection.ltr, style: new TextStyle (fontSize: 70.0)), links : 50.0, top: animation.value // Geanimeerde eigenschap)], textDirection: TextDirection.ltr,); 

Na een warme herstart moet je app nu de volgende animatie laten zien:

 

Conclusie

Je kent nu de basis van het maken van tween-animaties met behulp van het Flutter-framework. In deze zelfstudie hebt u ook geleerd hoe u deze met krommen natuurlijker kunt laten lijken. Begrijp dat in de langzame modus, die tijdens de ontwikkeling de standaardmodus is, de animaties een beetje laggy en onstabiel lijken. Alleen in de releasemodus kunt u hun werkelijke prestaties zien.

Raadpleeg de officiële documentatie voor meer informatie.