diff --git a/example/lib/custom_controller.dart b/example/lib/custom_controller.dart new file mode 100644 index 0000000..800261c --- /dev/null +++ b/example/lib/custom_controller.dart @@ -0,0 +1,57 @@ +/// Demonstrates how to create a custom controller to change the speed of an +/// animation + +import 'package:flutter/material.dart'; +import 'package:rive/rive.dart'; + +class SpeedyAnimation extends StatelessWidget { + const SpeedyAnimation({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Custom Controller'), + ), + body: Center( + child: RiveAnimation.network( + 'https://cdn.rive.app/animations/vehicles.riv', + fit: BoxFit.cover, + animations: const ['idle'], + controllers: [SpeedController('curves', speedMultiplier: 3)], + ), + ), + ); + } +} + +class SpeedController extends SimpleAnimation { + final double speedMultiplier; + + /// Stops the animation on the next apply + bool _stopOnNextApply = false; + + SpeedController( + String animationName, { + double mix = 1, + this.speedMultiplier = 1, + }) : super( + animationName, + mix: mix, + ); + + @override + void apply(RuntimeArtboard artboard, double elapsedSeconds) { + if (_stopOnNextApply || instance == null) { + isActive = false; + } + + instance!.animation.apply(instance!.time, coreContext: artboard, mix: mix); + if (!instance!.advance(elapsedSeconds * speedMultiplier)) { + _stopOnNextApply = true; + } + } + + @override + void onActivate() => _stopOnNextApply = false; +} diff --git a/example/lib/main.dart b/example/lib/main.dart index 47aa0ed..52afbbb 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:rive_example/custom_controller.dart'; import 'package:rive_example/play_one_shot_animation.dart'; import 'package:rive_example/play_pause_animation.dart'; import 'package:rive_example/example_state_machine.dart'; @@ -118,6 +119,20 @@ class Home extends StatelessWidget { ); }, ), + const SizedBox( + height: 10, + ), + ElevatedButton( + child: const Text('Custom Controller - Speed'), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const SpeedyAnimation(), + ), + ); + }, + ), ], ), ),