`

一个view如何同时响应onTouch和onClick事件

阅读更多

一个view如何同时响应onTouch和onClick事件

 

在项目中遇到的问题,需要同时给imageVIew设置onTouch和onClick事件 , 在onTouch事件中执行拖动操作,在onClick中执行显示一个对话框,可是两个事件一直有冲突。onTouch事件的返回值是boolean类型的,如果返回true ,那么就把事件拦截,onclick肯定无法响应;返回false,就同时执行onClick方法,要想把OnTouch和onClick事件完全的区
分,这里想到了一个不是很完美但使用完全没有错误的方法,就是在 OnTouch中的MotionEvent.ACTION_DOWN 时,记录下点(X1,Y1),在 MotionEvent.ACTION_UP 时,记录下点(X2,Y2),然后比对 俩点之间的距离,如果小于一个较小数值(比如5),就认为是Click事件,onTouch中返回false,如果距离较大,可以当作onTouch事件去处理,返回true:
示范如下:

 

@Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        int screenWidth = getResources().getDisplayMetrics().widthPixels;
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                lastX = (int) event.getRawX();
                lastY = (int) event.getRawY();
                x1 =  event.getRawX();//得到相对应屏幕左上角的坐标
                y1 =  event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                int dx = (int) event.getRawX() - lastX;
                int dy = (int) event.getRawY() - lastY;

                int left = v.getLeft() + dx;
                int top = v.getTop() + dy;
                int right = v.getRight() + dx;
                int bottom = v.getBottom() + dy;
                if (left < 0) {
                    left = 0;
                    right = left + v.getWidth();
                }
                if (right > screenWidth) {
                    right = screenWidth;
                    left = right - v.getWidth();
                }
                if (top < 0) {
                    top = 0;
                    bottom = top + v.getHeight();
                }
                if (bottom > screenHeight) {
                    bottom = screenHeight;
                    top = bottom - v.getHeight();
                }
                v.layout(left, top, right, bottom);
                lastX = (int) event.getRawX();
                lastY = (int) event.getRawY();
                break;
            case MotionEvent.ACTION_UP:
                x2 = event.getRawX();
                y2 = event.getRawY();
                Log.i("i", x1 + ",,," + y1 +",,,"+x2+",,,"+y2);
                double distance = Math.sqrt(Math.abs(x1-x2)*Math.abs(x1-x2)+Math.abs(y1-y2)*Math.abs(y1-y2));//两点之间的距离
                Log.i("i", "x1 - x2>>>>>>"+ distance);
                 if (distance < 15) { // 距离较小,当作click事件来处理 
                     showToastDialog("点击了");
                    return false;
                 } else {
                     showToastDialog("滑动了");
                    return true ;
                }
        }
        return false;   
    }

 

分享到:
评论
3 楼 hety163 2015-03-17  
如果你设置的是一个viewgroup的ontouch,想判断不同子view的onclick就不好了判断了吧。这种情况应该怎么办?
2 楼 miaowei 2013-11-08  
很感谢,提的意见很好。
1 楼 :倾诉 2013-11-08  
view的onTouchlistener的onTouch会拦截ontouchevent事件,ontouchevent中符合某种条件就会触发onClick事件,所以你实现了onTouch就不用管onClick了,应该把onClick中的处理代码直接放到 showToastDialog("点击了");这里,统一返回true。个人觉得这样比较好

相关推荐

    android悬浮框的onTouch和onClick事件同时存在

    标题提到的“android悬浮框的onTouch和onClick事件同时存在”是指在悬浮窗上,既能够响应用户的点击操作,又能够正确处理滑动行为。在Android中,由于触摸事件的分发机制,这两个事件的共存可能会遇到一些挑战。 ...

    onclick与ontouch和scroll监听冲突的解决方法

    在Android开发中,我们经常会遇到各种事件监听器的冲突问题,特别是`onclick`、`ontouch`和`scroll`监听器。这些事件在用户交互时可能会同时触发,导致不期望的行为,例如,当用户尝试滚动页面时,点击事件却意外...

    详谈Android中onTouch与onClick事件的关系(必看)

    4. 在实际应用中,可能需要同时处理`onTouch`、`onClick`和`onLongClick`。例如,你可能希望用户短按执行一个操作,长按执行另一个操作。在这种情况下,需要合理地组织这些监听器的逻辑,避免冲突和误触发。 测试...

    android click 和onTouch 事件处理机制.

    在同一个`View`中,如果同时覆盖了`onClick`、`onLongClick`和`onTouchEvent`,那么事件的处理顺序是这样的:`onTouchEvent`首先接收到`ACTION_DOWN`,然后可能会启动检查长按的定时器;当`ACTION_UP`到来时,如果...

    Android中丰富多彩的onTouch事件.rar

    这个方法返回一个布尔值,如果返回`true`,则表示该`View`消费了这个事件,否则事件会被传递给父`View`。 三、`ACTION_DOWN`、`ACTION_UP`与`ACTION_MOVE` 1. `ACTION_DOWN`:手指首次接触屏幕时触发,标志着一个...

    详细分析Android中onTouch事件传递机制

    总结来说,Android中的`onTouch`事件传递机制是一个从底层到高层,从子视图到父视图的逐层分发过程,视图可以选择处理事件或让事件继续冒泡。理解这一机制对于构建用户友好的触摸界面至关重要,它使得开发者能够精确...

    浅谈onTouch先执行,还是onClick执行(详解)

    当我们在一个按钮(Button)或者其他视图(View)上同时设置`OnClickListener`和`OnTouchListener`时,事件的处理流程如下: 1. 当用户触摸屏幕时,系统会调用`View`的`dispatchTouchEvent(MotionEvent event)`方法...

    030集-五种点击事件响应的对比

    在Android开发中,点击事件处理是用户界面交互的基础,它使得应用能够响应用户的操作,提供良好的用户体验。本视频教程“030集-五种点击事件响应的对比”深入探讨了Android中常见的五种点击事件处理方式,并进行比较...

    安卓事件分发机制的回答

    例如,当用户触摸一个嵌套在其他View内的子View时,事件会先传递给父View,然后由父View决定是否传递给子View。如果父View不处理事件(`onTouchEvent()`返回false),事件才会传递给子View。这种机制允许开发者在...

    009_android 之常见事件响应

    本教程“009_android 之常见事件响应”深入浅出地介绍了Android事件处理机制,帮助开发者更好地理解和实现用户交互。 一、事件传递机制 Android事件传递遵循“事件冒泡”原则,即事件会从最底层的View开始,沿着父...

    Android从源码的角度彻底理解事件分发机制的解析(上)

    当用户在屏幕上触摸时,系统会生成一个MotionEvent,然后通过事件分发机制将这个事件传递给相应的View或ViewGroup。 1. `dispatchTouchEvent(MotionEvent event)`:这是每个View和ViewGroup都会调用的方法,用于...

    点击响应Demo

    首先,你需要创建一个实现了OnClickListener接口的类,并重写onClick()方法。然后,将这个监听器设置给目标View: ```java button.setOnClickListener(new View.OnClickListener() { @Override public void ...

    按钮的长按响应事件(可以不断响应事件不属于OnLoginClick)

    首先,我们需要定义一个新的接口,这个接口将继承自`View.OnLongClickListener`,并添加一个能够持续响应的方法,例如`onLongPressUpdate()`。这样,我们就能在长按期间不断调用这个方法来更新数据。 2. **注册...

    Android事件的分发机制详解

    总的来说,Android事件分发机制是一个复杂但至关重要的过程,它确保了用户交互的有效处理和响应。理解这一机制有助于开发者更好地控制应用的用户界面交互,实现更复杂的UI效果。在开发过程中,合理利用事件分发机制...

    A0505事件处理Event1

    - `onFocusChange()`:在`View.OnFocusChangeListener`中,监听View焦点变化,提供两个参数,一个是当前View,另一个是是否获得焦点。 - `onKey()`:在`View.OnKeyListener`中,处理键盘按键事件,返回值同样表示...

    View触发事件

    如果需要在用户手指按下和抬起时执行某些操作,可以注册一个`OnTouchListener`并实现`onTouch(View v, MotionEvent event)`方法。对于“点击红色区域两下为跳转功能”,可能需要结合`OnTouchListener`来检测双击事件...

    安卓多点触控手势操作相关-响应单击双击事件监听.rar

    "安卓多点触控手势操作相关-响应单击双击事件监听"这个主题主要涉及如何在安卓应用中检测并处理单击和双击手势。 首先,让我们了解一下单击(Click)和双击(DoubleClick)事件。在安卓中,单击事件通常由`View`类...

    android事件传递测试

    否则,事件会递归地传递给子View,直到找到第一个返回true的View。 - **ACTION_MOVE**:在ACTION_DOWN之后的ACTION_MOVE事件,会直接发送给已经消费ACTION_DOWN的那个View。 - **ACTION_UP**:当手指抬起时,系统...

    Android 点击事件demo

    事件分发链包括`dispatchTouchEvent(MotionEvent event)`、`onTouchEvent(MotionEvent event)`和`onInterceptTouchEvent(MotionEvent event)`三个方法。`dispatchTouchEvent`在最上层,将事件分发给子View或自己...

Global site tag (gtag.js) - Google Analytics