@@ -10,6 +10,7 @@ class Parallaxable extends StatefulWidget {
10
10
final double rotateDiff;
11
11
final Widget above;
12
12
final Widget under;
13
+ final bool listen;
13
14
14
15
const Parallaxable ({
15
16
Key ? key,
@@ -19,6 +20,7 @@ class Parallaxable extends StatefulWidget {
19
20
this .rotateDiff = 1.1 ,
20
21
this .offsetRadio = 1.0 / 6 ,
21
22
this .offsetDepth = 2 ,
23
+ this .listen = false ,
22
24
}) : super (key: key);
23
25
24
26
@override
@@ -55,63 +57,76 @@ class _ParallaxableState extends State<Parallaxable> with SingleTickerProviderSt
55
57
builder: (BuildContext context, Widget ? child) {
56
58
final double rotatex = widget.angle * _aniController.value * xpercent;
57
59
final double rotatey = widget.angle * _aniController.value * ypercent;
58
- final double translatex =
59
- widget.offsetRadio == 0 ? 0 : _aniController.value * halfHeight * widget.offsetRadio * ypercent * - 1 ;
60
+ final double translatex = widget.offsetRadio == 0
61
+ ? 0
62
+ : _aniController.value * halfHeight * widget.offsetRadio * ypercent * - 1 ;
60
63
// double translatex = _aniController.value * halfHeight * widget.offsetRadio * ypercent;
61
64
final double translatey =
62
65
widget.offsetRadio == 0 ? 0 : _aniController.value * halfWidth * widget.offsetRadio * xpercent;
63
- return GestureDetector (
64
- onPanEnd: _panEnd,
65
- onPanUpdate: _panUpdate,
66
- onTapUp: _tapUp,
67
- onPanDown: _panDown,
68
- child: Stack (
69
- children: [
70
- Transform (
71
- transform: Matrix4 .identity ()
72
- ..setEntry (3 , 2 , 0.001 )
73
- ..rotateY (rotatey)
74
- ..rotateX (rotatex),
75
- alignment: Alignment .center,
76
- child: widget.under),
77
- Transform (
66
+ final stack = Stack (
67
+ children: [
68
+ Transform (
78
69
transform: Matrix4 .identity ()
79
70
..setEntry (3 , 2 , 0.001 )
80
- ..rotateY (rotatey / widget.rotateDiff)
81
- ..translate (translatex, translatey, widget.offsetDepth)
82
- ..rotateX (rotatex / widget.rotateDiff),
71
+ ..rotateY (rotatey)
72
+ ..rotateX (rotatex),
83
73
alignment: Alignment .center,
84
- child: widget.above,
85
- ),
86
- ],
87
- ),
74
+ child: widget.under),
75
+ Transform (
76
+ transform: Matrix4 .identity ()
77
+ ..setEntry (3 , 2 , 0.001 )
78
+ ..rotateY (rotatey / widget.rotateDiff)
79
+ ..translate (translatex, translatey, widget.offsetDepth)
80
+ ..rotateX (rotatex / widget.rotateDiff),
81
+ alignment: Alignment .center,
82
+ child: widget.above,
83
+ ),
84
+ ],
85
+ );
86
+ if (widget.listen) {
87
+ return Listener (
88
+ onPointerMove: (event) => _panUpdate (event.localPosition.dx, event.localPosition.dy),
89
+ onPointerCancel: (event) => _panEnd (),
90
+ onPointerDown: (event) => _panDown (event.localPosition.dx, event.localPosition.dy),
91
+ onPointerUp: (event) => _tapUp (),
92
+ child: stack,
93
+ );
94
+ }
95
+
96
+ return GestureDetector (
97
+ onPanCancel: _panEnd,
98
+ onPanEnd: (event) => _panEnd (),
99
+ onPanUpdate: (event) => _panUpdate (event.localPosition.dx, event.localPosition.dy),
100
+ onTapUp: (event) => _tapUp (),
101
+ onPanDown: (event) => _panDown (event.localPosition.dx, event.localPosition.dy),
102
+ child: stack,
88
103
);
89
104
},
90
105
animation: _aniController,
91
106
);
92
107
});
93
108
}
94
109
95
- void _panUpdate (DragUpdateDetails details ) {
110
+ void _panUpdate (double dx, double dy ) {
96
111
setState (() {
97
- ypercent = ((halfWidth - details.localPosition. dx) / halfWidth).clamp (- 1 , 1 );
98
- xpercent = ((details.localPosition. dy - halfHeight) / halfHeight).clamp (- 1 , 1 );
112
+ ypercent = ((halfWidth - dx) / halfWidth).clamp (- 1 , 1 );
113
+ xpercent = ((dy - halfHeight) / halfHeight).clamp (- 1 , 1 );
99
114
});
100
115
}
101
116
102
- void _panDown (DragDownDetails details ) {
117
+ void _panDown (double dx, double dy ) {
103
118
_aniController.forward ();
104
119
setState (() {
105
- ypercent = (halfWidth - details.localPosition. dx) / halfWidth;
106
- xpercent = (details.localPosition. dy - halfHeight) / halfHeight;
120
+ ypercent = (halfWidth - dx) / halfWidth;
121
+ xpercent = (dy - halfHeight) / halfHeight;
107
122
});
108
123
}
109
124
110
- void _tapUp (TapUpDetails details ) {
125
+ void _tapUp () {
111
126
_aniController.reverse ();
112
127
}
113
128
114
- void _panEnd (DragEndDetails details ) {
129
+ void _panEnd () {
115
130
_aniController.reverse ();
116
131
}
117
132
}
0 commit comments