使用OnTouchListeners捕获手势

时间:2015-04-14 02:07:25

标签: android slidedown slideup

我正在尝试在Android上捕获一个手势,我想在用户在视图上滑动时触发一个动作,当用户在相同视图上滑动时触发另一个动作。 我正在使用SetOntouchListener来捕获手势,这里是代码:

        LinearLayout arrowIv = (LinearLayout)findViewById(R.id.arrowInfoPanel);
    arrowIv.setOnTouchListener(new View.OnTouchListener()
    {
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            int action = MotionEventCompat.getActionMasked(event);

            Log.d("TAGTAG", "action: " + action);

            return true;
        }
    });

这是我的听众的输出

    action: 0
    action: 2
    action: 2
    action: 2
    action: 2
    action: 2
    action: 2
    action: 2
    action: 2
    action: 2
    action: 2
    action: 2
    action: 2
    action: 2
    action: 2
    action: 2
    action: 1

问题是:onTouch事件被多次调用,我该如何处理它并说“这是一个slideUp动作”? 根据谷歌的另一个细节“... ACTION_DOWN是所有触摸事件的起点。”,然后甚至是一个以ACTION_DOWN开始的slideUp。

2 个答案:

答案 0 :(得分:0)

    arrowIv.imageView.setOnTouchListener(new OnSwipeTouchListener() {
         public void onSwipeTop() {
        Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show();
        }
         public void onSwipeBottom() {
        Toast.makeText(MyActivity.this, "bottom", Toast.LENGTH_SHORT).show();
        }

        public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
   }
});

public class OnSwipeTouchListener implements OnTouchListener {

    private final GestureDetector gestureDetector;

    public OnSwipeTouchListener (Context ctx){
        gestureDetector = new GestureDetector(ctx, new GestureListener());
    }

    private final class GestureListener extends SimpleOnGestureListener {

        private static final int SWIPE_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) {
            boolean result = false;
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                     if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffY > 0) {
                            onSwipeBottom();
                        } else {
                            onSwipeTop();
                        }
                    }
                    result = true;

            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }
    }



    public void onSwipeTop() {
    }

    public void onSwipeBottom() {
    }
}

答案 1 :(得分:0)

据我所知,您想要检测用户是否在视图上向上或向下滑动?如果我得到您的问题,也许这是一个解决方法。 作为文件:

  

public static final int ACTION_DOWN按下的手势已经开始了   motion包含初始起始位置。

     

public static final int ACTION_UP按下的手势已经完成,   motion包含最终发布位置以及任何中间位置   自上次下跌或移动事件以来的点数。

知道向上滑动或向下滑动我认为你需要在ACTION_DOWN获得开始位置并在ACTION_UP结束位置。开始位置和结束位置的差异将让您知道向上或向下滑动。

StartPostion.Y - EndPosition.Y > 0 => slide up
StartPostion.Y - EndPosition.Y < 0 => slide down