-
Notifications
You must be signed in to change notification settings - Fork 3
/
swipedetector.dart
150 lines (131 loc) · 4.73 KB
/
swipedetector.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import 'package:flutter/material.dart';
class SwipeConfiguration {
//Vertical swipe configuration options
double verticalSwipeMaxWidthThreshold = 50.0;
double verticalSwipeMinDisplacement = 100.0;
double verticalSwipeMinVelocity = 300.0;
//Horizontal swipe configuration options
double horizontalSwipeMaxHeightThreshold = 50.0;
double horizontalSwipeMinDisplacement = 100.0;
double horizontalSwipeMinVelocity = 300.0;
SwipeConfiguration({
double verticalSwipeMaxWidthThreshold,
double verticalSwipeMinDisplacement,
double verticalSwipeMinVelocity,
double horizontalSwipeMaxHeightThreshold,
double horizontalSwipeMinDisplacement,
double horizontalSwipeMinVelocity,
}) {
if (verticalSwipeMaxWidthThreshold != null) {
this.verticalSwipeMaxWidthThreshold = verticalSwipeMaxWidthThreshold;
}
if (verticalSwipeMinDisplacement != null) {
this.verticalSwipeMinDisplacement = verticalSwipeMinDisplacement;
}
if (verticalSwipeMinVelocity != null) {
this.verticalSwipeMinVelocity = verticalSwipeMinVelocity;
}
if (horizontalSwipeMaxHeightThreshold != null) {
this.horizontalSwipeMaxHeightThreshold = horizontalSwipeMaxHeightThreshold;
}
if (horizontalSwipeMinDisplacement != null) {
this.horizontalSwipeMinDisplacement = horizontalSwipeMinDisplacement;
}
if (horizontalSwipeMinVelocity != null) {
this.horizontalSwipeMinVelocity = horizontalSwipeMinVelocity;
}
}
}
class SwipeDetector extends StatelessWidget {
final Widget child;
final Function() onSwipeUp;
final Function() onSwipeDown;
final Function() onSwipeLeft;
final Function() onSwipeRight;
final SwipeConfiguration swipeConfiguration;
SwipeDetector(
{@required this.child,
this.onSwipeUp,
this.onSwipeDown,
this.onSwipeLeft,
this.onSwipeRight,
SwipeConfiguration swipeConfiguration})
: this.swipeConfiguration = swipeConfiguration == null
? SwipeConfiguration()
: swipeConfiguration;
@override
Widget build(BuildContext context) {
//Vertical drag details
DragStartDetails startVerticalDragDetails;
DragUpdateDetails updateVerticalDragDetails;
//Horizontal drag details
DragStartDetails startHorizontalDragDetails;
DragUpdateDetails updateHorizontalDragDetails;
return GestureDetector(
child: child,
onVerticalDragStart: (dragDetails) {
startVerticalDragDetails = dragDetails;
},
onVerticalDragUpdate: (dragDetails) {
updateVerticalDragDetails = dragDetails;
},
onVerticalDragEnd: (endDetails) {
double dx = updateVerticalDragDetails.globalPosition.dx -
startVerticalDragDetails.globalPosition.dx;
double dy = updateVerticalDragDetails.globalPosition.dy -
startVerticalDragDetails.globalPosition.dy;
double velocity = endDetails.primaryVelocity;
//Convert values to be positive
if (dx < 0) dx = -dx;
if (dy < 0) dy = -dy;
double positiveVelocity = velocity < 0 ? -velocity : velocity;
if (dx > swipeConfiguration.verticalSwipeMaxWidthThreshold) return;
if (dy < swipeConfiguration.verticalSwipeMinDisplacement) return;
if (positiveVelocity < swipeConfiguration.verticalSwipeMinVelocity)
return;
if (velocity < 0) {
//Swipe Up
if (onSwipeUp != null) {
onSwipeUp();
}
} else {
//Swipe Down
if (onSwipeDown != null) {
onSwipeDown();
}
}
},
onHorizontalDragStart: (dragDetails) {
startHorizontalDragDetails = dragDetails;
},
onHorizontalDragUpdate: (dragDetails) {
updateHorizontalDragDetails = dragDetails;
},
onHorizontalDragEnd: (endDetails) {
double dx = updateHorizontalDragDetails.globalPosition.dx -
startHorizontalDragDetails.globalPosition.dx;
double dy = updateHorizontalDragDetails.globalPosition.dy -
startHorizontalDragDetails.globalPosition.dy;
double velocity = endDetails.primaryVelocity;
if (dx < 0) dx = -dx;
if (dy < 0) dy = -dy;
double positiveVelocity = velocity < 0 ? -velocity : velocity;
if (dx < swipeConfiguration.horizontalSwipeMinDisplacement) return;
if (dy > swipeConfiguration.horizontalSwipeMaxHeightThreshold) return;
if (positiveVelocity < swipeConfiguration.horizontalSwipeMinVelocity)
return;
if (velocity < 0) {
//Swipe Up
if (onSwipeLeft != null) {
onSwipeLeft();
}
} else {
//Swipe Down
if (onSwipeRight != null) {
onSwipeRight();
}
}
},
);
}
}