如何在一个ImageButton中同时使用Ontouch和Onclick?

68
在我的应用程序中,我想要两件事情发生。
  1. 当我触摸并拖动 ImageButton 时,它应该随着我的手指移动。

    我使用了 OnTouchListener() 实现这一点,它可以正常工作。

  2. 当我点击 ImageButton 时,它应该关闭 Activity。

    我使用了 OnClickListener() 实现这一点,它也可以正常工作。

所以,这是我的问题。每当我移动 ImageButton 时,OnTouchListener 被触发并且 ImageButton 移动,而在我从移动中释放按钮时,OnClickListener 也被触发。
如何在同一个按钮上使用 ontouch 和 onclick 监听器而不互相干扰?

使用GestureDetector来检测单击手势。 - Biraj Zalavadia
@BirajZalavadia 你好,能帮我解决这个问题吗?http://stackoverflow.com/questions/23452949/android-working-with-ontouch-onclick-and-onlongclick-together。 - Nitish
12个回答

0

声明一个私有变量,如:boolean hasMoved = false;

当图像按钮开始移动时,设置hasMoved = true

在您的OnClickListener中,仅在if(!hasMoved)执行代码--这意味着仅在按钮未移动时执行单击功能。之后设置hasMoved = false;


0
Perfect example for Both touch n tap both    
private void touchNtap() {
            GestureDetector gestureDetector = new GestureDetector(itemView.getContext()
                    , new SingleTapConfirm());


            imageView.setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (gestureDetector.onTouchEvent(event)) {
                        // program for click events
                        gestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
                            @Override
                            public boolean onSingleTapConfirmed(MotionEvent e) {
                                Log.d(TAG, "onSingleTapConfirmed() returned: " + true);
                                return false;
                            }

                            @Override
                            public boolean onDoubleTap(MotionEvent e) {
                                Log.d(TAG, "onDoubleTap() returned: " + true);
                                return false;
                            }

                            @Override
                            public boolean onDoubleTapEvent(MotionEvent e) {
                                Log.d(TAG, "onDoubleTapEvent() returned: " + true);
                                return false;
                            }
                        });
                        return true;
                    }else {
                        //program for touch events
                    }
                    return false;
                }
            });
        }
Create a Inner class 

    private class SingleTapConfirm extends GestureDetector.SimpleOnGestureListener {

            @Override
            public boolean onSingleTapUp(MotionEvent event) {
                return true;
            }

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接