在android中等待多点触摸输入

在android中等待多点触摸输入,android,multi-touch,Android,Multi Touch,我正在尝试做一个多点触摸应用程序。其动机是编写一个盲文应用程序,它将能够阅读盲文 我用盲文作为参考 以下是代码段: @Override public boolean onTouchEvent(MotionEvent event) { // get pointer index from the event object int pointerIndex = event.getActionIndex(); // get pointer ID

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

我用盲文作为参考

以下是代码段:

@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");
            }
        }
    }
@覆盖
公共布尔onTouchEvent(运动事件){
//从事件对象获取指针索引
int pointerIndex=event.getActionIndex();
//获取指针ID
int pointerId=event.getPointerId(pointerIndex);
//获取掩码(不特定于指针)操作
int maskedAction=event.getActionMasked();
开关(maskedAction和MotionEvent.ACTION\u MASK){
case MotionEvent.ACTION\u DOWN:
case MotionEvent.ACTION\u指针\u向下:{
//我们有一个新指针。让我们把它添加到指针列表中
PointF=新的PointF();
f、 x=event.getX(pointerIndex);
f、 y=event.getY(pointerIndex);
mActivePointers.put(pointerId,f);
解析盲文();
打破
}
case MotionEvent.ACTION_MOVE:{//指针已移动
对于(int size=event.getPointerCount(),i=0;i
这里发生的事情是,当我用两个手指触摸时,我想得到“b”作为回应,但我得到“a”是因为第一个手指,然后是“b”


如何解决此问题?

您将一次获得一个触摸事件,因此需要修改您的方法。我看到两种解决方案:(1)触摸后,等待给定的时间,以防用户按下另一个手指,或(2)使用首次启动事件,然后收集所有手指以确定合适的字母。

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

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

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

  • 记录一个手势。从
    ACTION\u DOWN
    ACTION\u UP
    记录您收到的所有
    MotionEvent

  • 使用所有录制的
    MotionEvent
    实例识别手势


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

    对于盲文,必须有平行触摸,因此如何使用up事件?你能提供一个例子吗?我没有真正有用的代码,但我的基本想法是,在一个关闭事件中,任何字母都被认为是暂定的,在这里,你可能希望显示它以方便用户,但主要是保存它以备以后使用。当你得到ActuoToPUP事件时,你会认为它是官方的。换句话说,parseBraille()不显示字母,而是将其保存在一个变量中,然后在操作中从变量中获取字母并将其发送到showMsg()。在实际操作中,这是可能的,但是您必须担心多个事件。