Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
cc201f32
Commit
cc201f32
authored
Oct 09, 2015
by
Kris Giesing
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Temporary holding commit
parent
79c88b4d
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
272 additions
and
45 deletions
+272
-45
double_tap.dart
packages/flutter/lib/src/gestures/double_tap.dart
+128
-20
tap.dart
packages/flutter/lib/src/gestures/tap.dart
+139
-22
gesture_detector.dart
packages/flutter/lib/src/widgets/gesture_detector.dart
+5
-3
No files found.
packages/flutter/lib/src/gestures/double_tap.dart
View file @
cc201f32
...
...
@@ -10,42 +10,150 @@ import 'package:sky/src/gestures/constants.dart';
import
'package:sky/src/gestures/recognizer.dart'
;
import
'package:sky/src/gestures/tap.dart'
;
class
DoubleTapGestureRecognizer
extends
PrimaryPointerGestureRecognizer
{
DoubleTapGestureRecognizer
({
PointerRouter
router
,
this
.
onDoubleTap
})
:
super
(
router:
router
,
deadline:
kTapTimeout
);
class
DoubleTapGestureRecognizer
extends
GestureArenaMember
{
static
int
sInstances
=
0
;
DoubleTapGestureRecognizer
({
this
.
router
,
this
.
onDoubleTap
})
{
_instance
=
sInstances
++;
}
PointerRouter
router
;
GestureTapListener
onDoubleTap
;
int
_numTaps
=
0
;
Timer
_longTimer
;
int
_instance
=
0
;
bool
_isTrackingPointer
=
false
;
int
_pointer
;
sky
.
Point
_initialPosition
;
Timer
_tapTimer
;
Timer
_doubleTapTimer
;
GestureArenaEntry
_entry
=
null
;
void
resolve
(
GestureDisposition
disposition
)
{
super
.
resolve
(
disposition
);
if
(
disposition
==
GestureDisposition
.
rejected
)
{
_numTaps
=
0
;
void
addPointer
(
sky
.
PointerEvent
event
)
{
message
(
"add pointer"
);
if
(
_initialPosition
!=
null
&&
!
_isWithinTolerance
(
event
))
{
message
(
"reset"
);
_reset
();
}
_pointer
=
event
.
pointer
;
_initialPosition
=
_getPoint
(
event
);
_isTrackingPointer
=
false
;
_startTapTimer
();
_stopDoubleTapTimer
();
_startTrackingPointer
();
if
(
_entry
==
null
)
{
message
(
"register entry"
);
_entry
=
GestureArena
.
instance
.
add
(
event
.
pointer
,
this
);
}
}
void
didExceedDeadline
()
{
stopTrackingPointer
(
primaryPointer
);
resolve
(
GestureDisposition
.
rejected
);
}
void
didExceedLongDeadline
()
{
_numTaps
=
0
;
_longTimer
=
null
;
void
message
(
String
s
)
{
print
(
"Double tap "
+
_instance
.
toString
()
+
": "
+
s
);
}
void
handlePrimaryPointer
(
sky
.
PointerEvent
event
)
{
void
handleEvent
(
sky
.
PointerEvent
event
)
{
message
(
"handle event"
);
if
(
event
.
type
==
'pointerup'
)
{
_numTaps
++;
_stopTapTimer
();
_stopTrackingPointer
();
if
(
_numTaps
==
1
)
{
_longTimer
=
new
Timer
(
kDoubleTapTimeout
,
didExceedLongDeadline
);
message
(
"start long timer"
);
_startDoubleTapTimer
();
}
else
if
(
_numTaps
==
2
)
{
resolve
(
GestureDisposition
.
accepted
);
onDoubleTap
(
);
message
(
"start found second tap"
);
_entry
.
resolve
(
GestureDisposition
.
accepted
);
}
}
else
if
(
event
.
type
==
'pointermove'
&&
!
_isWithinTolerance
(
event
))
{
message
(
"outside tap tolerance"
);
_entry
.
resolve
(
GestureDisposition
.
rejected
);
}
else
if
(
event
.
type
==
'pointercancel'
)
{
message
(
"cancel"
);
_entry
.
resolve
(
GestureDisposition
.
rejected
);
}
}
void
acceptGesture
(
int
pointer
)
{
message
(
"accepted"
);
_reset
();
_entry
=
null
;
print
(
"Entry is assigned null"
);
onDoubleTap
?.
call
();
}
void
rejectGesture
(
int
pointer
)
{
message
(
"rejected"
);
_reset
();
_entry
=
null
;
print
(
"Entry is assigned null"
);
}
void
dispose
()
{
_entry
?.
resolve
(
GestureDisposition
.
rejected
);
router
=
null
;
}
void
_reset
()
{
_numTaps
=
0
;
_initialPosition
=
null
;
_stopTapTimer
();
_stopDoubleTapTimer
();
_stopTrackingPointer
();
}
void
_startTapTimer
()
{
if
(
_tapTimer
==
null
)
{
_tapTimer
=
new
Timer
(
kTapTimeout
,
()
=>
_entry
.
resolve
(
GestureDisposition
.
rejected
)
);
}
}
void
_stopTapTimer
()
{
if
(
_tapTimer
!=
null
)
{
_tapTimer
.
cancel
();
_tapTimer
=
null
;
}
}
void
_startDoubleTapTimer
()
{
if
(
_doubleTapTimer
==
null
)
{
_doubleTapTimer
=
new
Timer
(
kDoubleTapTimeout
,
()
=>
_entry
.
resolve
(
GestureDisposition
.
rejected
)
);
}
}
void
_stopDoubleTapTimer
()
{
if
(
_doubleTapTimer
!=
null
)
{
_doubleTapTimer
.
cancel
();
_doubleTapTimer
=
null
;
}
}
void
_startTrackingPointer
()
{
if
(!
_isTrackingPointer
)
{
_isTrackingPointer
=
true
;
router
.
addRoute
(
_pointer
,
handleEvent
);
}
}
void
_stopTrackingPointer
()
{
if
(
_isTrackingPointer
)
{
_isTrackingPointer
=
false
;
router
.
removeRoute
(
_pointer
,
handleEvent
);
}
}
sky
.
Point
_getPoint
(
sky
.
PointerEvent
event
)
{
return
new
sky
.
Point
(
event
.
x
,
event
.
y
);
}
bool
_isWithinTolerance
(
sky
.
PointerEvent
event
)
{
sky
.
Offset
offset
=
_getPoint
(
event
)
-
_initialPosition
;
return
offset
.
distance
<=
kDoubleTapTouchSlop
;
}
}
packages/flutter/lib/src/gestures/tap.dart
View file @
cc201f32
...
...
@@ -2,44 +2,161 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import
'dart:async'
;
import
'dart:sky'
as
sky
;
import
'package:sky/src/gestures/arena.dart'
;
import
'package:sky/src/gestures/constants.dart'
;
import
'package:sky/src/gestures/recognizer.dart'
;
typedef
void
GestureTapCallback
(
);
class
TapGestureRecognizer
extends
PrimaryPointerGestureRecognizer
{
TapGestureRecognizer
({
PointerRouter
router
,
this
.
onTap
})
:
super
(
router:
router
,
deadline:
kTapTimeout
);
enum
TapResolution
{
tap
,
cancel
}
class
_TapGesture
{
_TapGesture
({
this
.
gestureRecognizer
,
sky
.
PointerEvent
event
})
{
assert
(
event
.
type
==
'pointerdown'
);
_pointer
=
event
.
pointer
;
_isTrackingPointer
=
false
;
_initialPosition
=
_getPoint
(
event
);
_entry
=
GestureArena
.
instance
.
add
(
_pointer
,
gestureRecognizer
);
_wonArena
=
false
;
_didTap
=
false
;
_startTimer
();
_startTrackingPointer
();
}
TapGestureRecognizer
gestureRecognizer
;
int
_pointer
;
bool
_isTrackingPointer
;
sky
.
Point
_initialPosition
;
GestureArenaEntry
_entry
;
Timer
_deadline
;
bool
_wonArena
;
bool
_didTap
;
void
handleEvent
(
sky
.
PointerEvent
event
)
{
print
(
"Tap gesture handleEvent"
);
assert
(
event
.
pointer
==
_pointer
);
if
(
event
.
type
==
'pointermove'
&&
!
_isWithinTolerance
(
event
))
{
_entry
.
resolve
(
GestureDisposition
.
rejected
);
}
else
if
(
event
.
type
==
'pointercancel'
)
{
_entry
.
resolve
(
GestureDisposition
.
rejected
);
}
else
if
(
event
.
type
==
'pointerup'
)
{
_stopTimer
();
_stopTrackingPointer
();
_didTap
=
true
;
_check
();
}
}
void
accept
()
{
print
(
"Tap gesture accept"
);
_wonArena
=
true
;
_check
();
}
void
reject
()
{
print
(
"Tap gesture reject"
);
_stopTimer
();
_stopTrackingPointer
();
gestureRecognizer
.
_resolveTap
(
_pointer
,
TapResolution
.
cancel
);
}
void
abort
()
{
_entry
.
resolve
(
GestureDisposition
.
rejected
);
}
void
_check
()
{
if
(
_wonArena
&&
_didTap
)
gestureRecognizer
.
_resolveTap
(
_pointer
,
TapResolution
.
tap
);
}
void
_startTimer
()
{
if
(
_deadline
==
null
)
{
_deadline
=
new
Timer
(
kTapTimeout
,
()
=>
_entry
.
resolve
(
GestureDisposition
.
rejected
)
);
}
}
void
_stopTimer
()
{
if
(
_deadline
!=
null
)
{
_deadline
.
cancel
();
_deadline
=
null
;
}
}
void
_startTrackingPointer
()
{
if
(!
_isTrackingPointer
)
{
_isTrackingPointer
=
true
;
gestureRecognizer
.
router
.
addRoute
(
_pointer
,
handleEvent
);
}
}
void
_stopTrackingPointer
()
{
if
(
_isTrackingPointer
)
{
_isTrackingPointer
=
false
;
gestureRecognizer
.
router
.
removeRoute
(
_pointer
,
handleEvent
);
}
}
sky
.
Point
_getPoint
(
sky
.
PointerEvent
event
)
{
return
new
sky
.
Point
(
event
.
x
,
event
.
y
);
}
bool
_isWithinTolerance
(
sky
.
PointerEvent
event
)
{
sky
.
Offset
offset
=
_getPoint
(
event
)
-
_initialPosition
;
return
offset
.
distance
<=
kTouchSlop
;
}
}
class
TapGestureRecognizer
extends
GestureArenaMember
{
TapGestureRecognizer
({
this
.
router
,
this
.
onTap
,
this
.
onTapDown
,
this
.
onTapCancel
});
PointerRouter
router
;
GestureTapCallback
onTap
;
GestureTapCallback
onTapDown
;
GestureTapCallback
onTapCancel
;
void
didExceedDeadline
()
{
stopTrackingPointer
(
primaryPointer
);
resolve
(
GestureDisposition
.
rejected
);
Map
<
int
,
_TapGesture
>
_gestureMap
=
new
Map
<
int
,
_TapGesture
>();
void
addPointer
(
sky
.
PointerEvent
event
)
{
_gestureMap
[
event
.
pointer
]
=
new
_TapGesture
(
gestureRecognizer:
this
,
event:
event
);
onTapDown
?.
call
();
}
void
handlePrimaryPointer
(
sky
.
PointerEvent
event
)
{
if
(
event
.
type
==
'pointerdown'
)
{
if
(
onTapDown
!=
null
)
onTapDown
();
}
else
if
(
event
.
type
==
'pointerup'
)
{
resolve
(
GestureDisposition
.
accepted
);
if
(
onTap
!=
null
)
onTap
();
}
void
acceptGesture
(
int
pointer
)
{
_gestureMap
[
pointer
]?.
accept
();
}
void
rejectGesture
(
int
pointer
)
{
super
.
rejectGesture
(
pointer
);
if
(
pointer
==
primaryPointer
)
{
assert
(
state
==
GestureRecognizerState
.
defunct
);
if
(
onTapCancel
!=
null
)
onTapCancel
();
}
_gestureMap
[
pointer
]?.
reject
();
}
void
_resolveTap
(
int
pointer
,
TapResolution
resolution
)
{
_gestureMap
.
remove
(
pointer
);
if
(
resolution
==
TapResolution
.
tap
)
onTap
?.
call
();
else
onTapCancel
?.
call
();
}
void
dispose
()
{
List
<
_TapGesture
>
localGestures
=
new
List
.
from
(
_gestureMap
.
values
);
for
(
_TapGesture
gesture
in
localGestures
)
entry
.
abort
();
// Rejection of each gesture should cause it to be removed from our map
assert
(
_gestureMap
.
isEmpty
);
router
=
null
;
}
}
packages/flutter/lib/src/widgets/gesture_detector.dart
View file @
cc201f32
...
...
@@ -119,10 +119,12 @@ class _GestureDetectorState extends State<GestureDetector> {
}
void
_syncDoubleTap
()
{
if
(
config
.
onDoubleTap
==
null
)
if
(
config
.
onDoubleTap
==
null
)
{
_doubleTap
=
_ensureDisposed
(
_doubleTap
);
else
_ensureDoubleTap
().
onDoubleTap
=
config
.
onDoubleTap
;
}
else
{
_doubleTap
=
new
DoubleTapGestureRecognizer
(
router:
_router
);
_doubleTap
.
onDoubleTap
=
config
.
onDoubleTap
;
}
}
void
_syncShowPress
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment