From a95d7df606bd2119423cc8a7ae51cacfb7b4dbed Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Mon, 1 Apr 2024 11:14:52 -0300 Subject: [PATCH] feat: Add custom long tap delay (#3110) Currently `longTapDelay` is hardcoded to 300ms. This is good for most of the games. But same games required custom long press values. This PR allows it. --------- Co-authored-by: Lukas Klingsbo --- doc/flame/inputs/tap_events.md | 4 +++ .../multi_tap_dispatcher.dart | 3 ++- .../game_mixins/multi_touch_tap_detector.dart | 3 ++- packages/flame/lib/src/events/tap_config.dart | 27 +++++++++++++++++++ .../flame/test/events/tap_config_test.dart | 20 ++++++++++++++ 5 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 packages/flame/lib/src/events/tap_config.dart create mode 100644 packages/flame/test/events/tap_config_test.dart diff --git a/doc/flame/inputs/tap_events.md b/doc/flame/inputs/tap_events.md index 2718d15cc5..c863e93d14 100644 --- a/doc/flame/inputs/tap_events.md +++ b/doc/flame/inputs/tap_events.md @@ -62,6 +62,10 @@ in `MultiTapDispatcher`), "long tap" will be triggered. This event invokes the `void onLongTapDown(TapDownEvent)` handler on those components that previously received the `onTapDown` event. +By default, the `.longTapDelay` is set to 300 milliseconds, what may be different of the system default. +You can change this value by setting the `TapConfig.longTapDelay` value. +It may also be useful for specific accessibility needs. + ### onTapUp diff --git a/packages/flame/lib/src/events/flame_game_mixins/multi_tap_dispatcher.dart b/packages/flame/lib/src/events/flame_game_mixins/multi_tap_dispatcher.dart index 20c7480e6c..fda4c01026 100644 --- a/packages/flame/lib/src/events/flame_game_mixins/multi_tap_dispatcher.dart +++ b/packages/flame/lib/src/events/flame_game_mixins/multi_tap_dispatcher.dart @@ -5,6 +5,7 @@ import 'package:flame/src/events/messages/tap_cancel_event.dart'; import 'package:flame/src/events/messages/tap_down_event.dart'; import 'package:flame/src/events/messages/tap_up_event.dart'; import 'package:flame/src/events/tagged_component.dart'; +import 'package:flame/src/events/tap_config.dart'; import 'package:flame/src/game/flame_game.dart'; import 'package:flame/src/game/game_render_box.dart'; import 'package:flutter/gestures.dart'; @@ -120,7 +121,7 @@ class MultiTapDispatcher extends Component implements MultiTapListener { /// The delay (in seconds) after which a tap is considered a long tap. @override - double get longTapDelay => 0.300; + double get longTapDelay => TapConfig.longTapDelay; @override void handleTap(int pointerId) {} diff --git a/packages/flame/lib/src/events/game_mixins/multi_touch_tap_detector.dart b/packages/flame/lib/src/events/game_mixins/multi_touch_tap_detector.dart index ca510d8162..bd5b41b089 100644 --- a/packages/flame/lib/src/events/game_mixins/multi_touch_tap_detector.dart +++ b/packages/flame/lib/src/events/game_mixins/multi_touch_tap_detector.dart @@ -1,4 +1,5 @@ import 'package:flame/events.dart'; +import 'package:flame/src/events/tap_config.dart'; import 'package:flame/src/game/game.dart'; import 'package:flutter/gestures.dart'; @@ -22,7 +23,7 @@ mixin MultiTouchTapDetector on Game implements MultiTapListener { //#region MultiTapListener API @override - double get longTapDelay => 0.300; + double get longTapDelay => TapConfig.longTapDelay; @override void handleTap(int pointerId) => onTap(pointerId); diff --git a/packages/flame/lib/src/events/tap_config.dart b/packages/flame/lib/src/events/tap_config.dart new file mode 100644 index 0000000000..9d1c6c45af --- /dev/null +++ b/packages/flame/lib/src/events/tap_config.dart @@ -0,0 +1,27 @@ +import 'dart:math'; + +/// [TapConfig] is used to expose specific configurations +/// related to the tap dispatcher. +final class TapConfig { + TapConfig._(); + + static double _longTapDelay = _defaultLongTapDelay; + + /// The delay (in seconds) after which a tap is considered a long tap. + static double get longTapDelay => _longTapDelay; + + /// Set the delay (in seconds) after which a tap is considered a long tap. + /// Same games may want to change the long tap delay to better + /// fit their needs or accessibility requirements. + static set longTapDelay(double value) { + _longTapDelay = max(_minLongTapDelay, value); + } + + /// Min delay to long tap delay is defined below. + /// Values too low don't make sense because they + /// would be basically a regular tap. + static const double _minLongTapDelay = 0.150; + + /// Default long tap delay is 0.3 seconds. + static const double _defaultLongTapDelay = 0.3; +} diff --git a/packages/flame/test/events/tap_config_test.dart b/packages/flame/test/events/tap_config_test.dart new file mode 100644 index 0000000000..c8ee59ec64 --- /dev/null +++ b/packages/flame/test/events/tap_config_test.dart @@ -0,0 +1,20 @@ +import 'package:flame/src/events/tap_config.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('TapConfig', () { + test('default longTapDelay is 0.3', () { + expect(TapConfig.longTapDelay, 0.3); + }); + + test('longTapDelay can be set new values', () { + TapConfig.longTapDelay = 0.5; + expect(TapConfig.longTapDelay, 0.5); + }); + + test('longTapDelay cannot be set to a value lower than 0.150', () { + TapConfig.longTapDelay = 0.1; + expect(TapConfig.longTapDelay, 0.150); + }); + }); +}