@@ -15,66 +15,109 @@ 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 GesturePanUpdateCallback (sky.Offset scrollDelta);
2522
26- class ScrollGestureRecognizer extends GestureRecognizer {
27- ScrollGestureRecognizer ({ PointerRouter router, this .onScrollStart , this .onScrollUpdate , this .onScrollEnd })
23+ abstract class _ScrollGestureRecognizer extends GestureRecognizer {
24+ _ScrollGestureRecognizer ({ PointerRouter router, this .onStart , this .onUpdate , this .onEnd })
2825 : super (router: router);
2926
30- GestureScrollStartCallback onScrollStart ;
31- GestureScrollUpdateCallback onScrollUpdate ;
32- GestureScrollEndCallback onScrollEnd ;
27+ GestureScrollStartCallback onStart ;
28+ Function onUpdate ;
29+ GestureScrollEndCallback onEnd ;
3330
34- ScrollState state = ScrollState .ready;
35- sky.Offset pendingScrollOffset;
31+ ScrollState _state = ScrollState .ready;
32+ dynamic _pendingScrollDelta;
33+
34+ dynamic get _initialPendingScrollDelta;
35+ dynamic _getScrollDelta (sky.PointerEvent event);
36+ bool get _hasSufficientPendingScrollDeltaToAccept;
3637
3738 void addPointer (sky.PointerEvent event) {
3839 startTrackingPointer (event.pointer);
39- if (state == ScrollState .ready) {
40- state = ScrollState .possible;
41- pendingScrollOffset = sky. Offset .zero ;
40+ if (_state == ScrollState .ready) {
41+ _state = ScrollState .possible;
42+ _pendingScrollDelta = _initialPendingScrollDelta ;
4243 }
4344 }
4445
4546 void handleEvent (sky.PointerEvent event) {
46- assert (state != ScrollState .ready);
47+ assert (_state != ScrollState .ready);
4748 if (event.type == 'pointermove' ) {
48- sky. Offset offset = _getScrollOffset (event);
49- if (state == ScrollState .accepted) {
50- if (onScrollUpdate != null )
51- onScrollUpdate (offset );
49+ dynamic delta = _getScrollDelta (event);
50+ if (_state == ScrollState .accepted) {
51+ if (onUpdate != null )
52+ onUpdate (delta );
5253 } else {
53- pendingScrollOffset += offset ;
54- if (pendingScrollOffset.distance > kTouchSlop )
54+ _pendingScrollDelta += delta ;
55+ if (_hasSufficientPendingScrollDeltaToAccept )
5556 resolve (GestureDisposition .accepted);
5657 }
5758 }
5859 stopTrackingIfPointerNoLongerDown (event);
5960 }
6061
6162 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 );
63+ if (_state != ScrollState .accepted) {
64+ _state = ScrollState .accepted;
65+ dynamic delta = _pendingScrollDelta ;
66+ _pendingScrollDelta = null ;
67+ if (onStart != null )
68+ onStart ();
69+ if (delta != _initialPendingScrollDelta && onUpdate != null )
70+ onUpdate (delta );
7071 }
7172 }
7273
7374 void didStopTrackingLastPointer () {
74- bool wasAccepted = (state == ScrollState .accepted);
75- state = ScrollState .ready;
76- if (wasAccepted && onScrollEnd != null )
77- onScrollEnd ();
75+ bool wasAccepted = (_state == ScrollState .accepted);
76+ _state = ScrollState .ready;
77+ if (wasAccepted && onEnd != null )
78+ onEnd ();
7879 }
80+ }
81+
82+ class VerticalScrollGestureRecognizer extends _ScrollGestureRecognizer {
83+ VerticalScrollGestureRecognizer ({
84+ PointerRouter router,
85+ GestureScrollStartCallback onStart,
86+ GestureScrollUpdateCallback onUpdate,
87+ GestureScrollEndCallback onEnd
88+ }) : super (router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
89+
90+ double get _initialPendingScrollDelta => 0.0 ;
91+ // Notice that we negate dy because scroll offsets go in the opposite direction.
92+ double _getScrollDelta (sky.PointerEvent event) => - event.dy;
93+ bool get _hasSufficientPendingScrollDeltaToAccept => _pendingScrollDelta.abs () > kTouchSlop;
94+ }
95+
96+ class HorizontalScrollGestureRecognizer extends _ScrollGestureRecognizer {
97+ HorizontalScrollGestureRecognizer ({
98+ PointerRouter router,
99+ GestureScrollStartCallback onStart,
100+ GestureScrollUpdateCallback onUpdate,
101+ GestureScrollEndCallback onEnd
102+ }) : super (router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
103+
104+ double get _initialPendingScrollDelta => 0.0 ;
105+ double _getScrollDelta (sky.PointerEvent event) => - event.dx;
106+ bool get _hasSufficientPendingScrollDeltaToAccept => _pendingScrollDelta.abs () > kTouchSlop;
107+ }
79108
109+ class PanGestureRecognizer extends _ScrollGestureRecognizer {
110+ PanGestureRecognizer ({
111+ PointerRouter router,
112+ GestureScrollStartCallback onStart,
113+ GestureScrollUpdateCallback onUpdate,
114+ GestureScrollEndCallback onEnd
115+ }) : super (router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
116+
117+ sky.Offset get _initialPendingScrollDelta => sky.Offset .zero;
118+ // Notice that we negate dy because scroll offsets go in the opposite direction.
119+ sky.Offset _getScrollDelta (sky.PointerEvent event) => new sky.Offset (event.dx, - event.dy);
120+ bool get _hasSufficientPendingScrollDeltaToAccept {
121+ return _pendingScrollDelta.dx > kTouchSlop || _pendingScrollDelta.dy > kTouchSlop;
122+ }
80123}
0 commit comments