@@ -33,13 +33,21 @@ class _ParallaxableState extends State<Parallaxable> with SingleTickerProviderSt
33
33
double xpercent = 1 ;
34
34
double ypercent = 1 ;
35
35
final rotating = 0 ;
36
-
36
+ bool reverse = false ;
37
37
late AnimationController _aniController;
38
38
39
39
@override
40
40
void initState () {
41
41
super .initState ();
42
42
_aniController = AnimationController (vsync: this , duration: const Duration (milliseconds: 100 ));
43
+ _aniController.addStatusListener ((status) {
44
+ if (status == AnimationStatus .completed) {
45
+ if (reverse) {
46
+ reverse = false ;
47
+ _aniController.reverse ();
48
+ }
49
+ }
50
+ });
43
51
}
44
52
45
53
@override
@@ -86,16 +94,16 @@ class _ParallaxableState extends State<Parallaxable> with SingleTickerProviderSt
86
94
if (widget.listen) {
87
95
return Listener (
88
96
onPointerMove: (event) => _panUpdate (event.localPosition.dx, event.localPosition.dy),
89
- onPointerCancel: (event) => _panEnd (),
97
+ onPointerCancel: (event) => _tapUp (),
90
98
onPointerDown: (event) => _panDown (event.localPosition.dx, event.localPosition.dy),
91
99
onPointerUp: (event) => _tapUp (),
92
100
child: stack,
93
101
);
94
102
}
95
103
96
104
return GestureDetector (
97
- onPanCancel: _panEnd ,
98
- onPanEnd: (event) => _panEnd (),
105
+ onPanCancel: _tapUp ,
106
+ onPanEnd: (event) => _tapUp (),
99
107
onPanUpdate: (event) => _panUpdate (event.localPosition.dx, event.localPosition.dy),
100
108
onTapUp: (event) => _tapUp (),
101
109
onPanDown: (event) => _panDown (event.localPosition.dx, event.localPosition.dy),
@@ -115,18 +123,20 @@ class _ParallaxableState extends State<Parallaxable> with SingleTickerProviderSt
115
123
}
116
124
117
125
void _panDown (double dx, double dy) {
118
- _aniController.forward ();
119
- setState (() {
120
- ypercent = (halfWidth - dx) / halfWidth;
121
- xpercent = (dy - halfHeight) / halfHeight;
122
- });
126
+ ypercent = (halfWidth - dx) / halfWidth;
127
+ xpercent = (dy - halfHeight) / halfHeight;
128
+ reverse = false ;
129
+ if (_aniController.isAnimating) {
130
+ _aniController.stop ();
131
+ }
132
+ _aniController.forward ();
123
133
}
124
134
125
135
void _tapUp () {
126
- _aniController.reverse ();
127
- }
128
-
129
- void _panEnd () {
130
- _aniController. reverse ();
136
+ if ( ! _aniController.isAnimating) {
137
+ _aniController. reverse ();
138
+ } else {
139
+ reverse = true ;
140
+ }
131
141
}
132
142
}
0 commit comments