android 多点MotionEvent的构建,多点操作屏幕,多点触碰屏幕

论android 多点触碰的构建。可以用于外设对于手机的多点操控,比如说手柄,键鼠等

1.我们先分析一下多个手点击滑动得到的MotionEvent。在view 重写onTouchEvent的方法,打印内容

2.分析的内容,这边不做详细的截图,自己去打印查看,我们分析两个点,开始一个点是Action=ACTION_DOWN,然后move,id就是0,点下第二个点,action=ACTION_POINTER_DOWN(1),id为1,第一个点的id还是0,并且可以看到两个点的坐标都是存在的,也就是这个MotionEvent是带着两个点的,接着释放一个点,这个时候你会看到如果释放的是第二个点,action=ACTION_POINTER_UP(1),如果释放的是第一个点,那么action=ACTION_POINTER_UP(0),当释放最后一个点的时候action=ACTION__UP

3.以此类推,三个点,四个点,就是ACTION_POINTER_DOWN(2)ACTION_POINTER_UP(2),每个点都是有id标识的,下标从0开始,点下的点跟释放的点都是同一个id。

4.创建多点,需要拿到action,sid,坐标。实现逻辑 当down下的时候,记录点下的点的id,id是从0开始,并且如果按下0,按下1,按下2,释放1,再按下id就是1,也就是说从0开始,如果中间某个id不存在就记录为当前的id,当move的时候就沿用这个id,当up的时候就移除这个uselist的对象,


    public void down(int keycode, int x, int y) {
        synchronized (lock) {
            try {
              GamePadEvent target = new GamePadEvent(keycode);
                //把新的target 添加到usedlist里面去,并且设置sid
                if (usedList.size() > 0) {
                    int i;
                    for (i = 0; i < 10; i++) {//写了10就是支持10个点
                        boolean found = false;
                        for (GamePadEvent each : usedList) {
                            if (each.sid == i) {
                                found = true;
                                break;
                            }
                        }
                        if (!found)
                            break;
                    }
                    target.sid = i;
                    usedList.add(i, target);
                } else {
                    target.sid = 0;
                    usedList.add(0, target);
                }
                MotionEvent event = getMultiEvent(target);
               //注入这里不写明,不同环境使用方法不一样,当前应用可以使用下面方法的去测试
               Instrumentation mInst = new Instrumentation();
                        if (event != null)
                            mInst.sendPointerSync(event.getMotionEvent());
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

5.重点是多点的构建,PointerProperties 主要构建sid,就是刚刚保存的id ,从下标0开始算,PointerCoords 主要是构建坐标, MotionEvent.obtain(),方式去构建一个新的MotionEvent。


private MotionEvent getMultiEvent(GamePadEvent target) {
        if (usedList.size() == 0)
            return null;
        long when = SystemClock.uptimeMillis();
        int action = MotionEvent.ACTION_MOVE;
        
        //记录当前按下的点的action是move,up,down,判断点是2个点还是一个点,记录当前的action,方便后面做计算
        if (target.action == MotionEvent.ACTION_DOWN)
            action = usedList.size() > 1 ? MotionEvent.ACTION_POINTER_DOWN : MotionEvent.ACTION_DOWN;

        if (target.action == MotionEvent.ACTION_UP)
            action = usedList.size() > 1 ? MotionEvent.ACTION_POINTER_UP : MotionEvent.ACTION_UP;

        PointerProperties[] pointerProperties = new PointerProperties[usedList.size()];
        PointerCoords[] pointerCoords = new PointerCoords[usedList.size()];
        int index = 0;
        int targetIndex = 0;
        LogUtils.logI(" getMultiEvent  usedList size :" + usedList.size());
        for (GamePadEvent gamePadEvent : usedList) {
            PointerCoords pointerCoord = new PointerCoords();
            pointerCoord.pressure = 1;
            pointerCoord.x = gamePadEvent.x;//x坐标
            pointerCoord.y = gamePadEvent.y;//yx坐标
            pointerCoords[index] = pointerCoord;

            PointerProperties pointerPropertie = new PointerProperties();
            pointerPropertie.id = gamePadEvent.sid;//保存的id
            pointerPropertie.toolType = 1;
            pointerProperties[index] = pointerPropertie;

            if (gamePadEvent.keycode == target.keycode) { 
                targetIndex = index;//记录当前的按下的点的位置,用作计算最后的action
            }
            ++index;
        }
        //这是计算最后的点的action,前面通过多点,单点判断得到了action,就位移计算,等到最后的值,如果是move事件,多点的action还是move,如果是其它两个down,up,
        int actionPoint = (action != MotionEvent.ACTION_MOVE) ? (action + (targetIndex << MotionEvent.ACTION_POINTER_INDEX_SHIFT)) : MotionEvent.ACTION_MOVE;
        
        return MotionEvent.obtain(when, when, actionPoint, usedList.size(), pointerProperties, pointerCoords, 0, 0, 1, 1, 0, 0, InputDevice.SOURCE_TOUCHSCREEN, 0);
    }

6.最后,如果有什么疑问,可以联系我。暂时没有编写demo,有空再编写

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Android多点识别是指Android设备可以同时检测并响应多个触摸点的能力。在触摸屏上,用户可以使用多个手指或触控笔来实现不同的手势和操作Android提供了多种多点识别的API,其中最常用的是通过MotionEvent类来实现。MotionEvent类提供了相关的方法来获取触摸事件的信息,如触摸点的数量、坐标、压力等。 在处理多点触摸事件时,我们可以通过判断触摸点的数量来执行不同的操作。例如,如果触摸点的数量为1,我们可以处理单点触摸操作,如滑动、点击等;如果触摸点的数量大于1,我们可以处理多点触摸操作,如缩放、旋转等。 另外,Android还提供了GestureDetector类和ScaleGestureDetector类来帮助开发者处理常见的手势操作,如滑动、缩放、旋转等。这些类封装了一些处理手势操作的算法,可以简化开发者的操作。 总的来说,Android多点识别功能让开发者可以更加灵活地处理用户的触摸操作,提供更丰富的交互体验。开发者可以利用Android提供的API和类库来实现各种复杂的手势操作,并为用户提供更加便捷和直观的操作方式。 ### 回答2: Android多点触控是指在一台Android设备的屏幕上,可以同时识别和响应多个手指触摸的操作。这项技术的引入,使得用户可以使用多指操作来进行各种操作,提供了更加丰富和灵活的交互方式。 Android多点触控主要通过以下几个关键技术来实现: 1. 坐标追踪:Android设备的屏幕使用坐标系统来标识不同的位置。在多点触控中,系统需要追踪每个手指的位置,并将其与具体的操作关联起来。通过使用触摸事件监听器和坐标系统,Android系统可以追踪并记录每个手指的位置信息。 2. 事件分发:当多个手指同时触摸屏幕时,操作系统需要分发并处理这些触摸事件。Android系统使用事件分发机制将触摸事件传递给正在活动状态的应用程序或视图。事件分发机制根据触摸位置、手指动作等因素来决定如何分发和处理触摸事件。 3. 手势识别:Android系统还提供了一系列用于识别各种手势的内置算法和工具。通过这些工具,Android应用程序可以检测和识别手势,例如双击、滑动和缩放等操作。这些手势识别功能可以增强用户体验,并提供更加直观和自然的多点触控交互方式。 总之,Android多点触控技术为用户提供了更加丰富和灵活的交互方式。通过追踪和记录手指位置、事件分发和手势识别等关键技术,Android系统可以实现多点触控,并且应用程序可以根据这些触摸事件进行相应处理。多点触控的引入使得用户可以使用多指操作,更加方便地进行各种操作,提升了用户的体验和操作效率。 ### 回答3: Android多点触控是指设备支持同时识别并处理多个触摸点的能力。多点触控在现代智能手机和平板电脑上被广泛应用,使得用户可以利用多指手势来实现更多的操作和交互方式。 Android系统通过使用触摸屏硬件和软件驱动程序来实现多点触控。触摸屏硬件会感知用户的触摸动作,并将触摸点的坐标和压力信息传递给操作系统。软件驱动程序则负责解析和处理这些信息,并将其传递给应用程序。 Android系统在多点触控方面提供了丰富的支持和功能。用户可以通过同时使用多个手指在屏幕上进行操作,例如缩放、旋转、拖动等。这些手势都可以通过Multi-touch事件来捕获和处理。开发者可以在应用程序中使用Multi-Touch API来实现多点触控的交互效果。 在Android开发中,常用的Multi-Touch API包括MotionEvent类和GestureDetector类。MotionEvent类提供了用于处理单个触摸点和多点触摸的方法和常量。GestureDetector类则提供了用于检测和处理手势的方法和回调。 总结来说,Android多点识别能力使得用户可以通过多指手势来进行更自由、更灵活的操作和交互。开发者可以利用相关的API来实现多点触控的功能,并提升应用程序的交互体验。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值