@@ -15,66 +15,113 @@ enum ScrollState {
1515}
1616
1717typedef void GestureScrollStartCallback ();
18- typedef void GestureScrollUpdateCallback (sky. Offset scrollDelta);
18+ typedef void GestureScrollUpdateCallback (double scrollDelta);
1919typedef void GestureScrollEndCallback ();
2020
21- sky.Offset _getScrollOffset (sky.PointerEvent event) {
22- // Notice that we negate dy because scroll offsets go in the opposite direction.
23- return new sky.Offset (event.dx, - event.dy);
24- }
21+ typedef void GesturePanStartCallback ();
22+ typedef void GesturePanUpdateCallback (sky.Offset scrollDelta);
23+ typedef void GesturePanEndCallback ();
2524
26- class ScrollGestureRecognizer extends GestureRecognizer {
27- ScrollGestureRecognizer ({ PointerRouter router, this .onScrollStart, this .onScrollUpdate, this .onScrollEnd })
25+ typedef void _GesturePolymorphicUpdateCallback <T >(T scrollDelta);
26+
27+ abstract class _ScrollGestureRecognizer <T extends dynamic > extends GestureRecognizer {
28+ _ScrollGestureRecognizer ({ PointerRouter router, this .onStart, this .onUpdate, this .onEnd })
2829 : super (router: router);
2930
30- GestureScrollStartCallback onScrollStart;
31- GestureScrollUpdateCallback onScrollUpdate;
32- GestureScrollEndCallback onScrollEnd;
31+ GestureScrollStartCallback onStart;
32+ _GesturePolymorphicUpdateCallback <T > onUpdate;
33+ GestureScrollEndCallback onEnd;
34+
35+ ScrollState _state = ScrollState .ready;
36+ T _pendingScrollDelta;
3337
34- ScrollState state = ScrollState .ready;
35- sky.Offset pendingScrollOffset;
38+ T get _initialPendingScrollDelta;
39+ T _getScrollDelta (sky.PointerEvent event);
40+ bool get _hasSufficientPendingScrollDeltaToAccept;
3641
3742 void addPointer (sky.PointerEvent event) {
3843 startTrackingPointer (event.pointer);
39- if (state == ScrollState .ready) {
40- state = ScrollState .possible;
41- pendingScrollOffset = sky. Offset .zero ;
44+ if (_state == ScrollState .ready) {
45+ _state = ScrollState .possible;
46+ _pendingScrollDelta = _initialPendingScrollDelta ;
4247 }
4348 }
4449
4550 void handleEvent (sky.PointerEvent event) {
46- assert (state != ScrollState .ready);
51+ assert (_state != ScrollState .ready);
4752 if (event.type == 'pointermove' ) {
48- sky. Offset offset = _getScrollOffset (event);
49- if (state == ScrollState .accepted) {
50- if (onScrollUpdate != null )
51- onScrollUpdate (offset );
53+ T delta = _getScrollDelta (event);
54+ if (_state == ScrollState .accepted) {
55+ if (onUpdate != null )
56+ onUpdate (delta );
5257 } else {
53- pendingScrollOffset += offset ;
54- if (pendingScrollOffset.distance > kTouchSlop )
58+ _pendingScrollDelta += delta ;
59+ if (_hasSufficientPendingScrollDeltaToAccept )
5560 resolve (GestureDisposition .accepted);
5661 }
5762 }
5863 stopTrackingIfPointerNoLongerDown (event);
5964 }
6065
6166 void acceptGesture (int pointer) {
62- if (state != ScrollState .accepted) {
63- state = ScrollState .accepted;
64- sky. Offset offset = pendingScrollOffset ;
65- pendingScrollOffset = null ;
66- if (onScrollStart != null )
67- onScrollStart ();
68- if (offset != sky. Offset .zero && onScrollUpdate != null )
69- onScrollUpdate (offset );
67+ if (_state != ScrollState .accepted) {
68+ _state = ScrollState .accepted;
69+ T delta = _pendingScrollDelta ;
70+ _pendingScrollDelta = null ;
71+ if (onStart != null )
72+ onStart ();
73+ if (delta != _initialPendingScrollDelta && onUpdate != null )
74+ onUpdate (delta );
7075 }
7176 }
7277
7378 void didStopTrackingLastPointer () {
74- bool wasAccepted = (state == ScrollState .accepted);
75- state = ScrollState .ready;
76- if (wasAccepted && onScrollEnd != null )
77- onScrollEnd ();
79+ bool wasAccepted = (_state == ScrollState .accepted);
80+ _state = ScrollState .ready;
81+ if (wasAccepted && onEnd != null )
82+ onEnd ();
7883 }
84+ }
85+
86+ class VerticalScrollGestureRecognizer extends _ScrollGestureRecognizer <double > {
87+ VerticalScrollGestureRecognizer ({
88+ PointerRouter router,
89+ GestureScrollStartCallback onStart,
90+ GestureScrollUpdateCallback onUpdate,
91+ GestureScrollEndCallback onEnd
92+ }) : super (router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
7993
94+ double get _initialPendingScrollDelta => 0.0 ;
95+ // Notice that we negate dy because scroll offsets go in the opposite direction.
96+ double _getScrollDelta (sky.PointerEvent event) => - event.dy;
97+ bool get _hasSufficientPendingScrollDeltaToAccept => _pendingScrollDelta.abs () > kTouchSlop;
98+ }
99+
100+ class HorizontalScrollGestureRecognizer extends _ScrollGestureRecognizer <double > {
101+ HorizontalScrollGestureRecognizer ({
102+ PointerRouter router,
103+ GestureScrollStartCallback onStart,
104+ GestureScrollUpdateCallback onUpdate,
105+ GestureScrollEndCallback onEnd
106+ }) : super (router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
107+
108+ double get _initialPendingScrollDelta => 0.0 ;
109+ double _getScrollDelta (sky.PointerEvent event) => - event.dx;
110+ bool get _hasSufficientPendingScrollDeltaToAccept => _pendingScrollDelta.abs () > kTouchSlop;
111+ }
112+
113+ class PanGestureRecognizer extends _ScrollGestureRecognizer <sky.Offset > {
114+ PanGestureRecognizer ({
115+ PointerRouter router,
116+ GesturePanStartCallback onStart,
117+ GesturePanUpdateCallback onUpdate,
118+ GesturePanEndCallback onEnd
119+ }) : super (router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
120+
121+ sky.Offset get _initialPendingScrollDelta => sky.Offset .zero;
122+ // Notice that we negate dy because scroll offsets go in the opposite direction.
123+ sky.Offset _getScrollDelta (sky.PointerEvent event) => new sky.Offset (event.dx, - event.dy);
124+ bool get _hasSufficientPendingScrollDeltaToAccept {
125+ return _pendingScrollDelta.dx.abs () > kTouchSlop || _pendingScrollDelta.dy.abs () > kTouchSlop;
126+ }
80127}
0 commit comments