Android Gesture - onDown仅在有时被调用

时间:2014-07-25 09:57:19

标签: android gesture-recognition

这是我第一次使用Android手势。我正在尝试使用我在此站点上找到的以下方法调用swipeRight()和swipeLeft()。

SwipeTouchListener.java

public class SwipeTouchListener implements View.OnTouchListener {

    private final GestureDetector gestureDetector;

    public SwipeTouchListener(Context context) {
        gestureDetector = new GestureDetector(context, new GestureListener());
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        gestureDetector.onTouchEvent(motionEvent);
        return true;
    }

    public void onSwipeLeft() {

    }

    public void onSwipeRight() {

    }

    private class GestureListener extends GestureDetector.SimpleOnGestureListener{

        private static final int SWIPE_DISTANCE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            float distanceX = e2.getX() - e1.getX();
            float distanceY = e2.getY() - e1.getY();
            if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                if (distanceX > 0)
                    onSwipeRight();
                else
                    onSwipeLeft();
                return true;
            }
            return false;
        }
    }

}

在我的Activity中,我调用以下方法并覆盖onSwipeLeft()和onSwipeRight()并在两者上显示Toast消息。

chartFlipper.setOnTouchListener(new SwipeTouchListener(this){

    @Override
    public void onSwipeLeft() {
        Toast.makeText(DashboardActivity.this, "Swipe Left", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onSwipeRight() {
        Toast.makeText(DashboardActivity.this, "Swipe Right", Toast.LENGTH_SHORT).show();
    }
});

但问题是,我只在极少数情况下看到了吐司的消息。我在onDown方法中放了一个断点,发现它只被调用了几次(比如20次一次)。

编辑:我在ViewFlipper上调用了这个方法。

编辑2:我在ViewFlipper中显示饼图和条形图作为2个视图。我刚刚发现在图表上滑动并没有记录为触摸。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

在您的方法中

 @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        float distanceX = e2.getX() - e1.getX();
        float distanceY = e2.getY() - e1.getY();
        if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
            if (distanceX > 0)
                onSwipeRight();
            else
                onSwipeLeft();
            return true;
        }
        return false;
    }

你对用户所覆盖的距离的AND条件应该大于SWIPE_DISTANCE_THRESHOLD距离,在每种情况下都可能不正确,并且你有SWIPE_VELOCITY_THRESHOLD的另一个AND条件,在很多情况下这可能低于阈值。所以你看到了结果只有在距离大于阈值且速度也大于阈值速度的情况下试图降低这些值并且你会更频繁地看到结果