@@ -12,14 +12,51 @@ import 'package:flutter/gestures.dart';
12
12
class GestureManager {
13
13
14
14
static GestureManager _instance;
15
+ GestureManager ._();
15
16
16
- GestureManager ._internal ();
17
+ factory GestureManager .instance () {
18
+ if (_instance == null ) {
19
+ _instance = GestureManager ._();
20
+
21
+ _instance.gestures[ClickGestureRecognizer ] = ClickGestureRecognizer ();
22
+ (_instance.gestures[ClickGestureRecognizer ] as ClickGestureRecognizer ).onClick = _instance.onClick;
23
+
24
+ _instance.gestures[SwipeGestureRecognizer ] = SwipeGestureRecognizer ();
25
+ (_instance.gestures[SwipeGestureRecognizer ] as SwipeGestureRecognizer ).onSwipe = _instance.onSwipe;
26
+
27
+ _instance.gestures[PanGestureRecognizer ] = PanGestureRecognizer ();
28
+ (_instance.gestures[PanGestureRecognizer ] as PanGestureRecognizer ).onStart = _instance.onPanStart;
29
+ (_instance.gestures[PanGestureRecognizer ] as PanGestureRecognizer ).onUpdate = _instance.onPanUpdate;
30
+ (_instance.gestures[PanGestureRecognizer ] as PanGestureRecognizer ).onEnd = _instance.onPanEnd;
31
+
32
+ _instance.gestures[LongPressGestureRecognizer ] = LongPressGestureRecognizer ();
33
+ (_instance.gestures[LongPressGestureRecognizer ] as LongPressGestureRecognizer ).onLongPressEnd = _instance.onLongPressEnd;
17
34
18
- factory GestureManager .getInstance () => _getInstance ();
35
+ _instance.gestures[ScaleGestureRecognizer ] = ScaleGestureRecognizer ();
36
+ (_instance.gestures[ScaleGestureRecognizer ] as ScaleGestureRecognizer ).onStart = _instance.onScaleStart;
37
+ (_instance.gestures[ScaleGestureRecognizer ] as ScaleGestureRecognizer ).onUpdate = _instance.onScaleUpdate;
38
+ (_instance.gestures[ScaleGestureRecognizer ] as ScaleGestureRecognizer ).onEnd = _instance.onScaleEnd;
39
+ }
40
+ return _instance;
41
+ }
19
42
20
43
final Map <Type , GestureRecognizer > gestures = < Type , GestureRecognizer > {};
21
44
22
- List <RenderBoxModel > renderBoxModelList = [];
45
+ List <RenderBoxModel > _renderBoxModelList = [];
46
+
47
+ RenderBoxModel _target;
48
+
49
+ void addTargetToList (RenderBoxModel renderBoxModel) {
50
+ _renderBoxModelList.add (renderBoxModel);
51
+ }
52
+
53
+ void clearTargetList () {
54
+ if (_renderBoxModelList.length != 0 ) {
55
+ // The target node triggered by the gesture is the bottom node of hittest.
56
+ _target = _renderBoxModelList[0 ];
57
+ }
58
+ _renderBoxModelList = [];
59
+ }
23
60
24
61
void addPointer (PointerEvent event) {
25
62
gestures.forEach ((key, gesture) {
@@ -28,87 +65,56 @@ class GestureManager {
28
65
}
29
66
30
67
void onClick (String eventType, { PointerDownEvent down, PointerUpEvent up }) {
31
- if (renderBoxModelList.length != 0 && renderBoxModelList[ 0 ] .onClick != null ) {
32
- renderBoxModelList[ 0 ] .onClick (eventType, up: up);
68
+ if (_target != null && _target .onClick != null ) {
69
+ _target .onClick (eventType, up: up);
33
70
}
34
- renderBoxModelList = [];
35
71
}
36
72
37
73
void onSwipe (Event event) {
38
- if (renderBoxModelList.length != 0 && renderBoxModelList[ 0 ] .onSwipe != null ) {
39
- renderBoxModelList[ 0 ] .onSwipe (event);
74
+ if (_target != null && _target .onSwipe != null ) {
75
+ _target .onSwipe (event);
40
76
}
41
- renderBoxModelList = [];
42
77
}
43
78
44
79
void onPanStart (DragStartDetails details) {
45
- if (renderBoxModelList.length != 0 && renderBoxModelList[ 0 ] .onPan != null ) {
46
- renderBoxModelList[ 0 ] .onPan (GestureEvent (EVENT_PAN , GestureEventInit ( state: EVENT_STATE_START , deltaX: details.globalPosition.dx, deltaY: details.globalPosition.dy )));
80
+ if (_target != null && _target .onPan != null ) {
81
+ _target .onPan (GestureEvent (EVENT_PAN , GestureEventInit ( state: EVENT_STATE_START , deltaX: details.globalPosition.dx, deltaY: details.globalPosition.dy )));
47
82
}
48
83
}
49
84
50
85
void onPanUpdate (DragUpdateDetails details) {
51
- if (renderBoxModelList.length != 0 && renderBoxModelList[ 0 ] .onPan != null ) {
52
- renderBoxModelList[ 0 ] .onPan (GestureEvent (EVENT_PAN , GestureEventInit ( state: EVENT_STATE_UPDATE , deltaX: details.globalPosition.dx, deltaY: details.globalPosition.dy )));
86
+ if (_target != null && _target .onPan != null ) {
87
+ _target .onPan (GestureEvent (EVENT_PAN , GestureEventInit ( state: EVENT_STATE_UPDATE , deltaX: details.globalPosition.dx, deltaY: details.globalPosition.dy )));
53
88
}
54
89
}
55
90
56
91
void onPanEnd (DragEndDetails details) {
57
- if (renderBoxModelList.length != 0 && renderBoxModelList[ 0 ] .onPan != null ) {
58
- renderBoxModelList[ 0 ] .onPan (GestureEvent (EVENT_PAN , GestureEventInit ( state: EVENT_STATE_END , velocityX: details.velocity.pixelsPerSecond.dx, velocityY: details.velocity.pixelsPerSecond.dy )));
92
+ if (_target != null && _target .onPan != null ) {
93
+ _target .onPan (GestureEvent (EVENT_PAN , GestureEventInit ( state: EVENT_STATE_END , velocityX: details.velocity.pixelsPerSecond.dx, velocityY: details.velocity.pixelsPerSecond.dy )));
59
94
}
60
- renderBoxModelList = [];
61
95
}
62
96
63
97
void onScaleStart (ScaleStartDetails details) {
64
- if (renderBoxModelList.length != 0 && renderBoxModelList[ 0 ] .onScale != null ) {
65
- renderBoxModelList[ 0 ] .onScale (GestureEvent (EVENT_SCALE , GestureEventInit ( state: EVENT_STATE_START )));
98
+ if (_target != null && _target .onScale != null ) {
99
+ _target .onScale (GestureEvent (EVENT_SCALE , GestureEventInit ( state: EVENT_STATE_START )));
66
100
}
67
101
}
68
102
69
103
void onScaleUpdate (ScaleUpdateDetails details) {
70
- if (renderBoxModelList.length != 0 && renderBoxModelList[ 0 ] .onScale != null ) {
71
- renderBoxModelList[ 0 ] .onScale (GestureEvent (EVENT_SCALE , GestureEventInit ( state: EVENT_STATE_UPDATE , rotation: details.rotation, scale: details.scale )));
104
+ if (_target != null && _target .onScale != null ) {
105
+ _target .onScale (GestureEvent (EVENT_SCALE , GestureEventInit ( state: EVENT_STATE_UPDATE , rotation: details.rotation, scale: details.scale )));
72
106
}
73
107
}
74
108
75
109
void onScaleEnd (ScaleEndDetails details) {
76
- if (renderBoxModelList.length != 0 && renderBoxModelList[ 0 ] .onScale != null ) {
77
- renderBoxModelList[ 0 ] .onScale (GestureEvent (EVENT_SCALE , GestureEventInit ( state: EVENT_STATE_END )));
110
+ if (_target != null && _target .onScale != null ) {
111
+ _target .onScale (GestureEvent (EVENT_SCALE , GestureEventInit ( state: EVENT_STATE_END )));
78
112
}
79
- renderBoxModelList = [];
80
113
}
81
114
82
115
void onLongPressEnd (LongPressEndDetails details) {
83
- if (renderBoxModelList.length != 0 && renderBoxModelList[0 ].onLongPress != null ) {
84
- renderBoxModelList[0 ].onLongPress (GestureEvent (EVENT_LONG_PRESS , GestureEventInit (deltaX: details.globalPosition.dx, deltaY: details.globalPosition.dy )));
85
- }
86
- renderBoxModelList = [];
87
- }
88
-
89
- static _getInstance () {
90
- if (_instance == null ) {
91
- _instance = GestureManager ._internal ();
92
-
93
- _instance.gestures[ClickGestureRecognizer ] = ClickGestureRecognizer ();
94
- (_instance.gestures[ClickGestureRecognizer ] as ClickGestureRecognizer ).onClick = _instance.onClick;
95
-
96
- _instance.gestures[SwipeGestureRecognizer ] = SwipeGestureRecognizer ();
97
- (_instance.gestures[SwipeGestureRecognizer ] as SwipeGestureRecognizer ).onSwipe = _instance.onSwipe;
98
-
99
- _instance.gestures[PanGestureRecognizer ] = PanGestureRecognizer ();
100
- (_instance.gestures[PanGestureRecognizer ] as PanGestureRecognizer ).onStart = _instance.onPanStart;
101
- (_instance.gestures[PanGestureRecognizer ] as PanGestureRecognizer ).onUpdate = _instance.onPanUpdate;
102
- (_instance.gestures[PanGestureRecognizer ] as PanGestureRecognizer ).onEnd = _instance.onPanEnd;
103
-
104
- _instance.gestures[LongPressGestureRecognizer ] = LongPressGestureRecognizer ();
105
- (_instance.gestures[LongPressGestureRecognizer ] as LongPressGestureRecognizer ).onLongPressEnd = _instance.onLongPressEnd;
106
-
107
- _instance.gestures[ScaleGestureRecognizer ] = ScaleGestureRecognizer ();
108
- (_instance.gestures[ScaleGestureRecognizer ] as ScaleGestureRecognizer ).onStart = _instance.onScaleStart;
109
- (_instance.gestures[ScaleGestureRecognizer ] as ScaleGestureRecognizer ).onUpdate = _instance.onScaleUpdate;
110
- (_instance.gestures[ScaleGestureRecognizer ] as ScaleGestureRecognizer ).onEnd = _instance.onScaleEnd;
116
+ if (_target != null && _target.onLongPress != null ) {
117
+ _target.onLongPress (GestureEvent (EVENT_LONG_PRESS , GestureEventInit (deltaX: details.globalPosition.dx, deltaY: details.globalPosition.dy )));
111
118
}
112
- return _instance;
113
119
}
114
120
}
0 commit comments