[android-developers] Re: why is onDoubleTap being called before second tup's up action?
On 20 Sty, 23:56, Kostya Vasilyev <kmans...@gmail.com> wrote:
> ( will try responding at the bottom for a change )
>
> 21 января 2012 г. 2:38 пользователь skink <psk...@gmail.com> написал:
>
>
>
>
>
>
>
> > Kostya Vasilyev wrote:
> > > Have you tried using MotionEvent.ACTION_CANCEL in the double-tap
> > listener?
>
> > > GestureDetector has code to reset its internal state in response to this:
>
> >https://github.com/android/platform_frameworks_base/blob/master/core/...
>
> > > I'm thinking you'd need post a handler message to self to get out of the
> > > current stack state when onDoubleTap is called, and then in response to
> > > that message, use ACTION_CANCEL to reset the gesture listener and then
> > > start the activity.
>
> > > -- Kostya
>
> > Kostya,
>
> > do you mean that in onDoubleTap (MotionEvent e) listener I should
> > modify "e" by:
>
> > e.setAction(MotionEvent.ACTION_CANCEL)
>
> > and then "feed" gesture detector with that modified event?
>
> No, that won't get you out of the call chain that exists when your
> onDoubleTap is called:
>
> https://github.com/android/platform_frameworks_base/blob/master/core/...
>
> There is code in GestureDetector's onTouchEvent after the call to
> onDoubleTap, and replacing the event's action will do nothing to skip it.
> The switch at line 468 won't go back to be re-evaluated, etc.
>
>
>
> > but if it cancels internal state of detector why to use a Handler?
>
> To return from your onDoubleTap listener to the gesture detector's
> onTouchEvent, let it execute the rest of its code, and only then send the
> cancel event to reset its state.
>
>
>
> > btw I already tried in onDoubleTap to post Runnable that starts
> > activity and it worked well but I decided it's dirty workaround -
> > that's why I used onDoubleTapEvent
>
> That's pretty similar to what I was suggesting, and also unwinds the call
> chain from the double-tap listener call.
>
> Perhaps the framework sends a cancel event in this case -- or perhaps your
> letting go after the double tap has time to register.
>
> I'd do a test to find out, keeping the finger down after the double-tap's
> second touch.
>
> If the gesture detector still works Ok after returning back to this
> activity (like your original email mentioned), good.
>
> If it doesn't, it would mean that you were just getting lucky with the
> timing of the second up event, and that sending a cancel is still necessary.
>
> Hope this makes sense.
>
> -- Kostya
>
>
>
Kostya,
thanks for your answer, however:
i tried 3 solutions (all of them are fixing my problem btw):
1) the most brutal: create new instance of GestureDetector
public boolean onDoubleTap(MotionEvent e) {
mDetector = new GestureDetector(this);
// start activity here
}
2) cancel() GestureDetector in-place of onDoubleTap
public boolean onDoubleTap(MotionEvent e) {
e.setAction(MotionEvent.ACTION_CANCEL);
mDetector.onTouchEvent(e);
// start activity here
}
3) cancel() GestureDetector with posted Runnable
public boolean onDoubleTap(final MotionEvent e) {
mHandler.post(new Runnable() {
public void run() {
e.setAction(MotionEvent.ACTION_CANCEL);
mDetector.onTouchEvent(e);
}
});
// start activity here
}
but i'm still in doubts: i think that my original solution using
onDoubleTapEvent is the most elegant and it doesn't use some internal
"black magic" knowledge about cancel() and MotionEvent.ACTION_CANCEL
pskink
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home