Android: detecting fling gestures
In my app I try to capture a fling event on a view (a ScrollView
to be exact, but tried with LinearLayout
as well).
By setting breakpoints I can see the that the MotionEvents
happen correctly up to the point where the onFling()
should fire.
The event flow is as follows:
- The view's
onTouchEvent
- The
OnGestureListener's onDown
- The
OnGestureL开发者_如何学运维istener's onShowPress
- The
OnGestureListener's onLongPress
I'm at a loss on how to go on trying to debug something like that and Google search does not turn up much. Any pointers ?
I also attach the relevant view that should handle the gestures:
import android.content.Context;
import android.content.Intent;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ScrollView;
public class GestureScrollView extends ScrollView {
private static int MAJOR_MOVE = 60;
private GestureDetector gd;
public GestureScrollView(final Context context) {
super(context);
gd = new GestureDetector(context,
new GestureDetector.OnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
int dx = (int) (e2.getX() - e1.getX());
if (Math.abs(dx) > MAJOR_MOVE
&& Math.abs(velocityX) > Math.abs(velocityY)) {
if (velocityX < 0) {
Intent intent = new Intent(context, Main.class);
context.startActivity(intent);
}
}
return false;
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return gd.onTouchEvent(event);
}
}
Take the MotionEvent from Activity not from your View. When your Gesture detector is based on MotionEvent that comes from Activity you will get the onFling event. So you have to move onTouchEvent() from your GestureScrollView to your Activity class. Regards!
精彩评论