How To Differentiate Between A Fling And A Touch?
Solution 1:
The way this is normally done is through the parent view's onInterceptTouchEvent
method. onInterceptTouchEvent
has a chance to see any touch event before a view's children do. If onInterceptTouchEvent
returns true
the child view that was previously handling touch events receives an ACTION_CANCEL
and the events from that point forward are sent to the parent's onTouchEvent
method for the usual handling. It can also return false
and simply spy on events as they travel down the view hierarchy to their usual targets.
You want to do essentially this in onInterceptTouchEvent
on the parent view where you're detecting the flings:
- On
ACTION_DOWN
, record the location of the touch. Returnfalse
. - On
ACTION_MOVE
, check the delta between initial touch down position and current position. If it's past a threshold value, (the framework usesViewConfiguration#getScaledTouchSlop()
or other appropriate values fromViewConfiguration
for things like this,) returntrue
. - Detect and handle the fling as usual based on
onTouchEvent
.
Once you intercept, the ListView
will cancel its touch handling and you won't get unwanted tap events on your list items. ListView
is also set up to disallow its parent from intercepting events once the user has started vertically scrolling the list, which means you won't get mistaken horizontal flings if the user sloppily flings the list vertically.
This is how things like the stock Android Launcher or News and Weather do side to side paging of scrolling/tappable content.
Solution 2:
Have you tried using SimpleOnGestureListener.onSingleTapConfirmed(MotionEvent) for the on touch event ("click")? This will only be called after the detector is confident that the user's first tap is really a tap and not a double tap (or hopefully a fling).
classMyGestureDetectorextendsSimpleOnGestureListener {
@OverridepublicbooleanonSingleTapConfirmed(MotionEvent event) {
// Code...
}
}
Post a Comment for "How To Differentiate Between A Fling And A Touch?"