如何在同一视图上执行onClick操作和onswipe操作

时间:2018-02-28 06:28:20

标签: android uiswipegesturerecognizer swipe-gesture

我有一个视图/视图组。当用户在该视图上从左向右滑动时,我想显示一些对话框。当点击/触摸同一个视图时,我需要发送其他活动/屏幕。

仅执行点击/触摸操作。我使用了Gesture监听器也没有像我预期的那样工作。

这是我的代码

 root=(LinearLayout)mView.findViewById(R.id.root_home);
        final GestureDetector gesture = new GestureDetector(getActivity(),
                new GestureDetector.SimpleOnGestureListener() {

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

                    @Override
                    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                                           float velocityY) {
                        //Log.i(Constants.APP_TAG, "onFling has been called!");
                        final int SWIPE_MIN_DISTANCE = 120;
                        final int SWIPE_MAX_OFF_PATH = 250;
                        final int SWIPE_THRESHOLD_VELOCITY = 200;
                        try {
                            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                                return false;
                            if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                                Log.i(Constants.APP_TAG, "Right to Left");


                            } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                                Log.i(Constants.APP_TAG, "Left to Right");


                            }
                        } catch (Exception e) {
                            // nothing
                        }
                        return super.onFling(e1, e2, velocityX, velocityY);
                    }
                });

        root.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return gesture.onTouchEvent(event);
            }
        });

       root.setOnTouchListener(new OnSwipeTouchListener(getActivity()) {
            @Override
            public void onSwipeLeft() {
                // Whatever

                Toast.makeText(getActivity(), "left", Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onSwipeRight() {
                // Whatever

                Toast.makeText(getActivity(), "right", Toast.LENGTH_SHORT).show();
            }
        });

        return mView;
    }

    public class OnSwipeTouchListener implements View.OnTouchListener {

        private final GestureDetector gestureDetector;

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

        public void onSwipeLeft() {
        }

        public void onSwipeRight() {
        }

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

        private final 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;
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

如果无法管理滑动,这里是一段工作代码。 yourView是您要将侦听器附加到的视图。

yourView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {

                    case MotionEvent.ACTION_DOWN:
                        x1 = event.getX();
                        y1 = event.getY();
                        t1 = System.currentTimeMillis();
                        return true;
                    case MotionEvent.ACTION_UP:
                        x2 = event.getX();
                        y2 = event.getY();
                        t2 = System.currentTimeMillis();

                        if (x1 == x2 && y1 == y2 && (t2 - t1) < CLICK_DURATION) {
                            Toast.makeText(getActivity(), "Click", Toast.LENGTH_SHORT).show();
                        } else if ((t2 - t1) >= CLICK_DURATION) {
                            Toast.makeText(getActivity(), "Long click", Toast.LENGTH_SHORT).show();
                        } else if (x1 > x2) {
                            Toast.makeText(getActivity(), "Left swipe", Toast.LENGTH_SHORT).show();
                        } else if (x2 > x1) {
                            Toast.makeText(getActivity(), "Right swipe", Toast.LENGTH_SHORT).show();
                        } 


                        return true;
                }

                return false;
            }