【问题标题】:Waiting for multi-touch input in android等待android中的多点触控输入
【发布时间】:2015-12-27 22:12:42
【问题描述】:

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

我使用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”作为响应,但由于第一根手指然后是“b”,我得到了“a”。

如何解决这个问题?

【问题讨论】:

    标签: android multi-touch


    【解决方案1】:

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

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

    2. 有限状态机:不太准确,最快的方法,你现在正在尝试的方法。你基本上必须:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 在盲文的情况下,必须有平行触摸,那么如何使用up事件呢?你能举个例子吗?
      • 我没有真正有用的代码,但我的基本想法是,在 DOWN 事件中,任何字母都被认为是暂定的,您可能希望在其中显示它以方便用户,但主要是保存以后再说。当您收到 ACTION_UP 事件时,您认为它是正式的。换句话说,parseBraille() 不是显示字母,而是将它保存在一个变量中,然后在 ACTION_UP 中,您从变量中获取它并将其发送到 showMsg()。可以在 ACTION_POINTER_UP 中执行此操作,但是您必须担心多个事件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多