diff --git a/.rive_head b/.rive_head index b5a9321..f82107e 100644 --- a/.rive_head +++ b/.rive_head @@ -1 +1 @@ -2f8251e8b9b9b98ae61144c3be87cb970db2e35e +d5e74de08cf60ca51715c034727c840cda6e683f diff --git a/CHANGELOG.md b/CHANGELOG.md index 84c6cee..6ed9989 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Bumps to `rive_native: 0.0.12`. Updates the Rive C++ runtime and renderer for the latest features, bug fixes, and performance improvements. +- Added multi-touch support - Reduced the number of texture allocations made when resizing widgets using `Factory.rive`, improving memory efficiency and performance. - Enhanced painting and texture creation behavior when resizing widgets or windows with `Factory.rive`, resulting in smoother widget resizing. - Better aligned the native and web implementations to ensure consistent behavior across all platforms. diff --git a/example/assets/multitouch.riv b/example/assets/multitouch.riv new file mode 100644 index 0000000..4de906f Binary files /dev/null and b/example/assets/multitouch.riv differ diff --git a/example/lib/examples/examples.dart b/example/lib/examples/examples.dart index 2a159cd..46792cc 100644 --- a/example/lib/examples/examples.dart +++ b/example/lib/examples/examples.dart @@ -6,6 +6,7 @@ export 'databinding_lists.dart'; export 'events.dart'; export 'hit_test_behaviour.dart'; export 'inputs.dart'; +export 'multi_touch.dart'; export 'pause_play.dart'; export 'network_asset.dart'; export 'out_of_band_assets.dart'; diff --git a/example/lib/examples/multi_touch.dart b/example/lib/examples/multi_touch.dart new file mode 100644 index 0000000..2ac81ab --- /dev/null +++ b/example/lib/examples/multi_touch.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:rive/rive.dart'; +import 'package:rive_example/main.dart' show RiveExampleApp; + +class ExampleMultiTouch extends StatefulWidget { + const ExampleMultiTouch({super.key}); + + @override + State createState() => _ExampleMultiTouchState(); +} + +class _ExampleMultiTouchState extends State { + FileLoader fileLoader = FileLoader.fromAsset( + 'assets/multitouch.riv', + riveFactory: RiveExampleApp.getCurrentFactory, + ); + + @override + void dispose() { + fileLoader.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return RiveWidgetBuilder( + fileLoader: fileLoader, + dataBind: DataBind.auto(), + builder: (context, state) => switch (state) { + RiveLoading() => const Center( + child: Center(child: CircularProgressIndicator()), + ), + RiveFailed() => ErrorWidget.withDetails( + message: state.error.toString(), + error: FlutterError(state.error.toString()), + ), + RiveLoaded() => RiveWidget(controller: state.controller) + }, + ); + } +} diff --git a/example/lib/main.dart b/example/lib/main.dart index f230b11..63b2349 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -128,6 +128,8 @@ class _RiveExampleAppState extends State { 'Rive graphics respect Flutter time dilation.'), _Page('Flutter Transform', ExampleTransform(), 'Rive graphics respect Flutter transform.'), + _Page('Flutter Multi Touch', ExampleMultiTouch(), + 'Rive graphics respect Flutter multi touch.'), // _Page('Flutter Hero Transitions', Todo(), // 'Create smooth transitions between pages with Rive graphics.'), // _Page('Flutter State Management', Todo(), diff --git a/lib/src/painters/widget_controller.dart b/lib/src/painters/widget_controller.dart index 0e6cd11..031b50b 100644 --- a/lib/src/painters/widget_controller.dart +++ b/lib/src/painters/widget_controller.dart @@ -170,15 +170,15 @@ base class RiveWidgetController extends BasicArtboardPainter ); final HitResult hitResult; if (event is PointerDownEvent) { - hitResult = stateMachine.pointerDown(position); + hitResult = stateMachine.pointerDown(position, pointerId: event.pointer); } else if (event is PointerUpEvent) { - hitResult = stateMachine.pointerUp(position); + hitResult = stateMachine.pointerUp(position, pointerId: event.pointer); } else if (event is PointerMoveEvent) { - hitResult = stateMachine.pointerMove(position); + hitResult = stateMachine.pointerMove(position, pointerId: event.pointer); } else if (event is PointerHoverEvent) { - hitResult = stateMachine.pointerMove(position); + hitResult = stateMachine.pointerMove(position, pointerId: event.pointer); } else if (event is PointerExitEvent) { - hitResult = stateMachine.pointerExit(position); + hitResult = stateMachine.pointerExit(position, pointerId: event.pointer); } else { hitResult = HitResult.none; }