首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

onTouchListener ACTION_MOVE不能与多个手指一起工作

ACTION_MOVE 是 Android 中的一个触摸事件类型,当用户在屏幕上滑动手指时触发。如果你发现 ACTION_MOVE 事件不能与多个手指一起工作,这可能是由于以下几个原因:

基础概念

在 Android 中,触摸事件通过 MotionEvent 类来表示,它包含了触摸点的位置、动作类型(如 ACTION_DOWN, ACTION_MOVE, ACTION_UP)等信息。当用户触摸屏幕时,系统会生成一系列的 MotionEvent 对象,并通过 onTouchEvent 方法传递给监听器。

可能的原因

  1. 多点触控支持:Android 设备支持多点触控,但默认情况下,ACTION_MOVE 事件可能只处理单点触控。
  2. 触摸事件分发:如果你的视图层级比较复杂,触摸事件可能在分发过程中被拦截或消耗。
  3. 手势识别器:如果你使用了 GestureDetector 或其他手势识别器,它们可能会影响触摸事件的处理。

解决方法

要解决 ACTION_MOVE 不能与多个手指一起工作的问题,可以尝试以下几种方法:

1. 启用多点触控支持

确保你的应用支持多点触控。可以在 AndroidManifest.xml 文件中为你的 Activity 设置 android:windowSoftInputMode="adjustResize" 属性。

代码语言:txt
复制
<activity android:name=".YourActivity"
          android:windowSoftInputMode="adjustResize">
</activity>

2. 处理多点触控事件

onTouchEvent 方法中处理多点触控事件。可以通过 MotionEventgetPointerCount 方法获取当前触摸点的数量。

代码语言:txt
复制
@Override
public boolean onTouchEvent(MotionEvent event) {
    int action = event.getActionMasked();
    int pointerCount = event.getPointerCount();

    switch (action) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:
            // 处理单点或多点按下事件
            break;
        case MotionEvent.ACTION_MOVE:
            if (pointerCount > 1) {
                // 处理多点移动事件
                for (int i = 0; i < pointerCount; i++) {
                    int pointerId = event.getPointerId(i);
                    float x = event.getX(i);
                    float y = event.getY(i);
                    // 处理每个触摸点的移动
                }
            } else {
                // 处理单点移动事件
            }
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
            // 处理单点或多点抬起事件
            break;
    }
    return true;
}

3. 检查触摸事件分发

确保触摸事件没有被上层视图拦截。可以在 onInterceptTouchEvent 方法中返回 false,表示不拦截触摸事件。

代码语言:txt
复制
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return false;
}

4. 使用手势识别器

如果你使用了手势识别器,确保它们不会影响多点触控事件的处理。可以尝试移除手势识别器,或者自定义手势识别器来处理多点触控事件。

代码语言:txt
复制
GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        // 处理滑动事件
        return super.onFling(e1, e2, velocityX, velocityY);
    }
});

@Override
public boolean onTouchEvent(MotionEvent event) {
    gestureDetector.onTouchEvent(event);
    return super.onTouchEvent(event);
}

参考链接

通过以上方法,你应该能够解决 ACTION_MOVE 不能与多个手指一起工作的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android触摸事件传递(上)

前言:智能手机早已成为我们今天身边必不可少的手持设备,iOS和Android也是目前主流的二大移动操作系统,当然也有越来越多的开发者加入到移动开发的工作中来。...有一些成长道路上的一些经验和教训,很早就想动手记录下来,再三下决心,终鼓起勇气,敲起键盘,有了下文,初次行文,文笔未免羞涩,大神轻点喷~     我们都知道,触摸事件对我们移动App来说至关重要,人机交互从我们手指的各种触摸手势开始...在Android中,系统将触摸事件包装成MotionEvent对象,同时MotionEvent类内部定义了ACTION_DOWN, ACTION_UP, ACTION_MOVE,ACTION_CANCEL...也非常好理解,我们查看MotionEvent源代码,ACTION_DONW = 0, ACTION_UP=1, ACTION_MOVE=2, 打印的日志与我们手指的触摸操作完全一致,先是触发了ACTION_DOWN...事件,然后是几个ACTION_MOVE事件,最后是ACTION_UP事件。

1.1K30

事件分发工作流程

具体如下: ACTION_DOWN: 表示手指按下屏幕 ACTION_MOVE: 手指在屏幕上滑动时,会产生一系列的MOVE事件 ACTION_UP: 手指抬起,离开屏幕 ACTION_CANCEL:当出现异常情况事件序列被中断...,会产生该类型事件 ACTION_POINTER_DOWN: 当已经有一个手指按下的情况下,另一个手指按下会产生该事件 ACTION_POINTER_UP: 多个手指同时按下的情况下,抬起其中一个手指会产生该事件...因此下面的工作流程中都是指down事件的分发 ,而不是ACTION_MOVE或ACTION_UP的分发。...view会先检查是否有onTouchListener且返回值是否为true,如果是true则直接返回,否则调用onTouchEvent方法来处理事件。 基于上述的关系,可以得到下面的工作流程图: ?...而如果当前view处理事件,那么就一层层向上抛,寻找处理的viewGroup。 上述的工作流程模型并不是完整的,还有其他的特殊情况没有考虑。

73110
  • View,ViewGroup的Touch事件的分发机制

    ViewGroup的事件分发机制 我们用手指去触摸Android手机屏幕,就会产生一个触摸事件,但是这个触摸事件在底层是怎么分发的呢?...ACTION_DOWN的话,直接将Touch事件派发给target return target.dispatchTouchEvent(ev);      }   这个方法相对来说还是蛮长,不过所有的逻辑都写在一起...从上面的流程图得出一个结论,Touch事件是从顶层的View一直往下分发到手指按下的最里面的View,如果这个View的onTouchEvent()返回false,即不消费Touch事件,这个Touch...直接从CustomLayout的dispatchTouchEvent()分析 我们先看ACTION_DOWN 来到25行,由于我们重写了onInterceptTouchEvent()返回true, 所以走这个...View,如果最里层View消费了ACTION_DOWN事件(设置onTouchListener,并且onTouch()返回true 或者onTouchEvent()方法返回true)才会触发ACTION_MOVE

    1.2K70

    Android面试老生常谈的 View 事件分发机制,看这一篇就够了!

    对于工作几年的我们来说,这是必须掌握的,讲不明白,那你回去等通知吧,哈哈。 ?...根据不同动作,主要有以下三种事件类型: 1.ACTION_DOWN:手指刚接触屏幕,按下去的那一瞬间产生该事件 2.ACTION_MOVE:手指在屏幕上移动时候产生该事件 3.ACTION_UP:手指从屏幕上松开的瞬间产生该事件...点击后抬起,也就是单击操作:ACTION_DOWN -> ACTION_UP 点击后再风骚的滑动一段距离,再抬起:ACTION_DOWN -> ACTION_MOVE -> … -> ACTION_MOVE...下面让我们一起来看看怎么解决。 常见的三种情况 第一种情况,滑动方向不同 ? 第二种情况,滑动方向相同 ? 第三种情况,上述两种情况的嵌套 ?...ScaleGestureDetector 这里暂时展开描述了了,写着写着,发现好多呀,一个周末就这样过去,贼快,觉得对你有帮助的,请来个三连,点赞,收藏,转发?。

    65620

    View 事件分发机制,看这一篇就够了

    对于工作几年的我们来说,这是必须掌握的,讲不明白,那你回去等通知吧,哈哈。 ?...根据不同动作,主要有以下三种事件类型: 1.ACTION_DOWN:手指刚接触屏幕,按下去的那一瞬间产生该事件 2.ACTION_MOVE:手指在屏幕上移动时候产生该事件 3.ACTION_UP:手指从屏幕上松开的瞬间产生该事件...点击后抬起,也就是单击操作:ACTION_DOWN -> ACTION_UP 点击后再风骚的滑动一段距离,再抬起:ACTION_DOWN -> ACTION_MOVE -> … -> ACTION_MOVE...下面让我们一起来看看怎么解决。 常见的三种情况 第一种情况,滑动方向不同 ? 第二种情况,滑动方向相同 ? 第三种情况,上述两种情况的嵌套 ?...ScaleGestureDetector 这里暂时展开描述了,写着写着,发现好多呀,一个周末就这样过去,贼快,觉得对你有帮助的,请来个三连,点赞,收藏,转发?。 ---- 小结 这篇文章,其实不难。

    71640

    Android 事件分发机制

    首先我们的手指和屏幕接触的MotionEvent对象会产生一系列事件,它有四种状态: MotionEvent对象的四种状态: MotionEvent.ACTION_DOWN:手指按下屏幕的瞬间 MotionEvent.ACTION_MOVE...:手指在屏幕上移动 MotionEvent.ACTION_UP:手指离开屏幕瞬间 MotionEvent.ACTION_CANCEL :取消手势,一般由程序产生 事件分发所涉及的主要方法: 1.1 dispatchTouchEvent...1.2 onInterceptTouchEvent 是viewGroup特有的,用来做触摸事件拦截的,默认返回false:如果false或者super表示拦截,事件继续向下传递。...1.6 onClick 是一个点击事件,是在onTouchEvent的up事件里面执行的,它的优先级是最低,如果在onTouchEvent或OnTouchListener的onTouch方法如果返回true...image.png ACTION_CANCEL这个动作目前是被触发了,但大家有没有发现后续move没有再经过ViewGroup,明明是在ViewGroup的ACTION_MOVE中return

    1.7K21

    一文读懂Android View事件分发机制

    根据不同动作,主要有以下三种事件类型: ACTION_DOWN:手指刚接触屏幕,按下去的那一瞬间产生该事件 ACTION_MOVE手指在屏幕上移动时候产生该事件 ACTION_UP:手指从屏幕上松开的瞬间产生该事件...点击后抬起,也就是单击操作:ACTION_DOWN -> ACTION_UP 点击后再风骚的滑动一段距离,再抬起:ACTION_DOWN -> ACTION_MOVE -> ... -> ACTION_MOVE...上面代码我们给button设置了OnTouchListener并重写了onTouch方法,方法返回值默认为false。如果这里我们返回true,那么你会发现onclick方法执行了!!!What?...ViewGroup也是View)而言,如果设置了onTouchListener,那么OnTouchListener方法中的onTouch方法会被回调。...当没有设置OnTouchListener或者设置了OnTouchListener但是onTouch方法返回false则会调用View自己的onTouchEvent方法。

    34720

    Carson带你学Android:手把手带你深入分析事件分发机制!

    具体介绍如下: 此处需要特别说明:事件列,即指从手指接触屏幕至手指离开屏幕这个过程产生的一系列事件。一般情况下,事件列都是以DOWN事件开始、UP事件结束,中间有无数的MOVE事件。...若在onInterceptTouchEvent()中返回false,即拦截事件,从而进入到条件判断的内部 // b....返回false:拦截(默认) * b....结果分析 点击Button时,因为ViewGroup默认拦截,所以事件会传递到子View Button,于是执行Button.onClick()。...主要包括: 工作流程总结 业务流程总结 以分发对象为核心的总结 以方法为核心的总结 4.1 工作流程-总结 Android事件分发流程 = Activity -> ViewGroup -> View,即

    79610

    Android之GestureDetector使用

    一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,...)Touchup: onDown->onSingleTapUp->onSingleTapConfirmed 点击一下稍微慢点的(滑动)Touchup: onDown->onShowPress->...e1, MotionEvent e2, float velocityX,float velocityY) 滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个...ACTION_MOVE, 1个ACTION_UP触发 参数解释: e1:第1个ACTION_DOWN MotionEvent e2:最后一个ACTION_MOVE MotionEvent velocityX...无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法 在ACTION_MOVE动作发生时就会触发 滑屏:手指触动屏幕后,稍微滑动后立即松开 onDown-----》onScroll

    72010

    札记:android手势识别,MotionEvent

    Gestures 用户手指(一或多个)按下和最终完全离开屏幕的过程为一次触屏操作,每次操作都可归类为不同触摸模式(touch pattern),最终被定义为不同的手势(手势和模式的定义是设计上的,用户在使用任何触屏设备后都会学习到不同的手势...ACTION_MOVE 非最后一个手指抬起触发ACTION_POINTER_UP 最后离开屏幕时触发ACTION_UP 触摸事件序列被中断时触发ACTION_CANCEL,一般是对应View的parent...而getActionMasked()和上面语句的执行逻辑是一样的——返回包含pointerIndex的action常量值。...通常,需要对手势运动进行响应,比如画面跟随手指的移动而移动(平移),简单的实现就是在ACTION_MOVE中即时偏移对应的x,y,这种情况下对动作的“响应时机”是显而易见的。...要知到,ViewGroup可以包含View,也可以包含。所以实际的事件有的是childView应该处理的,有的是“落在”ViewGroup本身区域内。

    5.1K70

    FloatWindowUtils 实现及事件冲突解决详解

    使其可以拖动 显然上面的 Button 只是能显示在系统屏幕上而已,并不能拖动,要使其能够拖动就要给它设置一个 View.OnTouchListener 来监听手指在屏幕上滑动的坐标然后根据这个坐标设置其位置...,但是你会发现当你拖动一段较小距离时会有很大几率响应它的 Click 事件,这显然不能接受,在拖动这个 Button 的整个过程中会依次触发 ACTION_DOWN、ACTION_MOVEACTION_MOVE...、ACTION_UP,当 ACTION_MOVE 被触发时 ACTION_DOWN 会被释放,之后松开手指触发 ACTION_UP 是不会响应 Click 事件的, Click 事件的响应条件是 ACTION_DOWN...| Gravity.TOP; mLayoutParams.format = PixelFormat.RGBA_8888; //此处mLayoutParams.type建议使用...boolean onInterceptTouchEvent(MotionEvent ev) { //此回调如果返回true则表示拦截TouchEvent由自己处理,false表示拦截

    2.9K20

    笔记(四)——事件分发机制

    反之onInterceptTouchEvent()拦截事件ACTION_DOWN,后面的ACTION_MOVE、ACTION_UP才能交由它处理。...(1)、同一个事件序列是指从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束,在这个过程中所产生的一系列事件,这个事件序列以down事件开始,中间含有数量不定的move事件,最终以up事件结束。...image (6)、ViewGroup默认拦截任何事件。Android源码中ViewGroup的onInterceptTouchEvent方法默认返回false。...优先级:onTouchListener > onTouchEvent > OnClickListener (11)、事件传递过程是由外向内的,即事件总是先传递给父元素,然后再由父元素分发给子View,通过...所有的事件都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交由父容器进行处理,这种方法和Android中的事件分发机制不一致,需要配合requestDisallowInterceptTouchEvent方法才能正常工作

    1K30

    Android查缺补漏(View篇)--事件分发机制

    可能在平时的开发工作中我们并没有意识到事件分发机制起到的作用,其实它是时刻存在的只是我们不知道而已,就像一些滑动冲突、点击事件之间的冲突等等大多是因为事件分发处理不当导致的。...想起了博主大学时做过一个小项目,里面就出现了滑动冲突的问题,虽然最后在网上一步步看着别人的教程也糊里糊涂的解决了,但终究不知其所以然,那么今天就让我们一起来深入的探索一下事件分发机制吧。...MotionEvent.ACTION_MOVE:手指在屏幕上移动时会多次触发此类型。 MotionEvent.ACTION_UP:手指在屏幕上抬起时触发此类型。...如果此方法返回false表示拦截事件,事件将传递给下级View的dispatchTouchEvent()。...无论根View的下级View是不是ViewGroup,如果拦截事件,最终事件会传递到一个纯View的控件上。

    63280

    Android事件分发机制源码解析

    一个最简单的用户触摸事件一般经过以下几个流程: 手指按下 手指滑动 手指抬起 Android把这些事件的每一步抽象为MotionEvent这一概念,MotionEvent包含了触摸的坐标位置,点按的数量...(手指的数量),时间点等信息,用于描述用户当前的具体动作,常见的MotionEvent有下面几种类型: ACTION_DOWN ACTION_UP ACTION_MOVE ACTION_CANCEL 其中...,ACTION_DOWN、ACTION_MOVE、ACTION_UP就分别对应于上面的手指按下、手指滑动、手指抬起操作,即一个最简单的用户操作包含了一个ACTION_DOWN事件,若干个ACTION_MOVE...return false; } 代码量不多,主要做了三件事: 若View设置了OnTouchListener,且处于enable状态时,会先调用mOnTouchListener的onTouch...中没有子View对事件进行消费或者子View的数量为零,事件将由ViewGroup自己处理,处理流程和View的处理流程一致; 事件传递至View的dispatchTouchEvent()时, 首先会判断OnTouchListener

    76730

    2014-11-8Android学习------手势识别事件的处理GestureDetector--------动画Animation学习篇

    我们一般在手机上有这些动作: 1)按下;2)长按下但未拖动;3)按下并且拖动未松开;4)按下并且并且拖动最后松开 这些动作对应的总共有三个静态变量来描述他们: 1)ACTION_DOWN,按下;2)ACTION_MOVE...可以看到有两个接口可以让我们利用:OnGestureListener和onTouchListener 首先我们看看onTouchListener public class MyGesture extends...一定立刻触发 * (2)Touch Down后过一会没有滑动先触发onShowPress再触发onLongPress * So: Touch Down后一直滑动...* 两个函数都是在Touch Down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touch Up时触发 * 点击一下非常快的(滑动...)Touch Up: onDown->onSingleTapUp->onSingleTapConfirmed * 点击一下稍微慢点的(滑动)Touch Up: onDown->onShowPress

    72940
    领券