android - 等待android中的多点触控输入

标签 android multi-touch

我正在尝试做一个多点触控应用程序。动机是编写一个盲文应用程序,它将能够阅读盲文。

我正在使用 this用于盲文引用。

这是代码段:

@Override
    public boolean onTouchEvent(MotionEvent event) {

        // get pointer index from the event object
        int pointerIndex = event.getActionIndex();

        // get pointer ID
        int pointerId = event.getPointerId(pointerIndex);

        // get masked (not specific to a pointer) action
        int maskedAction = event.getActionMasked();

        switch (maskedAction & MotionEvent.ACTION_MASK) {

            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_POINTER_DOWN: {
                // We have a new pointer. Lets add it to the list of pointers

                PointF f = new PointF();
                f.x = event.getX(pointerIndex);
                f.y = event.getY(pointerIndex);
                mActivePointers.put(pointerId, f);
                parseBraille();
                break;
            }
            case MotionEvent.ACTION_MOVE: { // a pointer was moved
                for (int size = event.getPointerCount(), i = 0; i < size; i++) {
                    PointF point = mActivePointers.get(event.getPointerId(i));
                    if (point != null) {
                        point.x = event.getX(i);
                        point.y = event.getY(i);
                    }
                }
                break;
            }
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
            case MotionEvent.ACTION_CANCEL: {
                mActivePointers.remove(pointerId);
                break;
            }
        }
        invalidate();
        return true;
    }

    private void showMsg(String msg){
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
    }

   private void parseBraille(){
        if (mActivePointers.size() == 1){
            showMsg("a");
        }
        else if (mActivePointers.size() == 2){
            double x0 = mActivePointers.get(0).x;
            double y0 = mActivePointers.get(0).y;
            double x1 = mActivePointers.get(1).x;
            double y1 = mActivePointers.get(1).y;
            if (Math.abs(mActivePointers.get(0).x - mActivePointers.get(1).x) < 50){
                showMsg("b");
            }
        }
    }

这里发生的事情是,当我用两根手指触摸时,我想得到“b”作为响应,但我得到的是“a”,因为第一个手指然后是“b”。

如何解决这个问题?

最佳答案

您可以使用两种不同的方法来解决这个问题:

  1. 机器学习:更准确,更费时。你让一些人表演所有的盲文字母表。您记录下所有执行的字母(我们称它们为手势)并使用它们来训练模型。该模型将用于在运行时识别新手势。

  2. 有限状态机:精度较低但速度最快的方法,您现在正在尝试的方法。你基本上必须:

    1. 记录手势。从ACTION_DOWNACTION_UP记录了你收到的所有MotionEvent

    2. 使用所有记录的 MotionEvent 实例识别手势。

您的代码中的问题是您试图识别 ACTION_POINTER_DOWN 事件中的手势(方法 parseBraille)。每当用户在触摸屏上按下手指时都会触发此事件,第一次按下手指时也会触发此事件。在那一刻,你将无法识别手势。您必须等待手势结束。

关于android - 等待android中的多点触控输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34485367/

相关文章:

android - 如何启用多点触摸拖动事件

android - LazyColumn 交换项目动画

android - 在 Android 中将数据从一个 Activity 传递到另一个 Activity

android - ActionBar 外部的自定义溢出菜单

iphone - 防止同时触摸多个按钮

javascript - 桌面 webapp 中的多点触控手势

android - 如何在 Android 布局中将 View 居中?

android - 使用 MockK 测试 LiveData 和协程

C# - 多点触控帮助? USB网络摄像头输入?图像分析?

Android Multitouch - 可以在模拟器中测试吗?