【问题标题】:How to perform onClick action and onswipe operation on same view如何在同一视图上执行 onClick 操作和 onswipe 操作
【发布时间】:2018-02-28 06:28:20
【问题描述】:

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

它只执行点击/触摸操作。我使用了 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;
            }
        }
    }

【问题讨论】:

    标签: android uiswipegesturerecognizer swipe-gesture


    【解决方案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;
                }
    

    【讨论】:

    • 谢谢,它仅适用于单个视图..但是我有视图组我想在视图组上滑动,并且该视图组包含一些带有 onclick 列表的视图..
    • 您完全可以像之前尝试的那样将OnTouchListener 设置为LinearLayout。我认为您应该尝试一下,因为我让它在我的应用程序中工作
    • 谢谢,获得正确点击和滑动的 CLICK_DURATION 值是多少。
    • 您可以播放和调整,我没有看到所有视图组,也无法考虑您要捕获的所有点击事件
    • 很高兴听到这个消息,那么您可以接受这个答案,因为它可以帮助您解决问题。只需点击答案左侧的勾号,其他人就会知道代码有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多