【问题标题】:Trigger ACTION_POINTER_DOWN event programmatically以编程方式触发 ACTION_POINTER_DOWN 事件
【发布时间】:2017-03-02 09:09:49
【问题描述】:

想要触发on two fingers down 事件几毫秒。

我可以使用以下代码触发简单的触摸事件:

 objImageView.getLocationOnScreen(coords);
                    int xa = coords[0];
                    int ys = coords[1];
                    objImageView.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0));
                    objImageView.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0));
                    objImageView.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0));

现在,如果我尝试对 ACTION_POINTER_DOWN 做同样的事情,什么都不会发生。这是我的代码:

  int[] coords = new int[2];
        parentLayout.getLocationOnScreen(coords);
        int xa = coords[0];
        int ys = coords[1];
        parentLayout.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_POINTER_DOWN, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0));
        parentLayout.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0));
        parentLayout.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_POINTER_UP, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0));

我想触发当用户将两根手指向下并在那里按住几毫秒时调用的相同事件。

【问题讨论】:

  • 好吧,我仍然无法执行该操作,目前,我通过将它们写入其他方法来强制调用TouchListener的代码。
  • 为什么要使用动作指针?如果您希望能够每隔几毫秒触发一次,请使用带有 Timer 或其他计时事件的线程。将 onTouch 代码提取到一个 void 中,并从线程和 onTouch 触发它

标签: android android-touch-event


【解决方案1】:

要模拟“两根手指”,您需要创建一个包含多个一个指针的动作事件,就像您现在所做的那样。

为此,请使用支持多个指针的MotionEvent obtain 变体,如here 所述。

MotionEvent obtain (long downTime, 
                long eventTime, 
                int action, 
                int pointerCount, 
                PointerProperties[] pointerProperties, 
                PointerCoords[] pointerCoords, 
                int metaState, 
                int buttonState, 
                float xPrecision, 
                float yPrecision, 
                int deviceId, 
                int edgeFlags, 
                int source, 
                int flags)

首先你应该为食指发送一个事件(就像你做的那样),当你要模拟MotionEvent.ACTION_POINTER_DOWN你应该使用上面的obtain变体。

字段很容易解释,请确保参数是:

  1. pointerCount = 2
  2. pointerProperties = [firstFingerPointerProperties, secondFingerPointerProperties]
  3. pointerCoords = [firstFingerPointerCoords, secondFingerPointerCoords]

【讨论】:

    【解决方案2】:

    Documentation 说:“手势以带有 ACTION_DOWN 的运动事件开始,它提供第一个向下或向下指针的位置。随着每个向下或向上的额外指针,框架将生成带有 ACTION_POINTER_DOWN 或 ACTION_POINTER_UP 的运动事件因此。”所以你首先需要触发简单的触摸事件。看看this的问题。

    【讨论】:

    • 谢谢@Andriy 我会检查那些
    • @SyedaZunairah 你试过什么代码?你应该尝试这样的序列:ACTION_DOWN -> ACTION_POINTER_DOWN -> 可选的小延迟 -> ACTION_POINTER_UP -> ACTION_UP
    【解决方案3】:

    您应该生成这样的序列:ACTION_DOWN -> ACTION_POINTER_DOWN -> 可选的小延迟 -> ACTION_POINTER_UP -> ACTION_UP

    您还应该为第二个指针正确设置指针索引(和其他元数据),否则手势检测代码可能无法判断二次按下的 ACTION_POINTER_DOWN 描述的是辅助手指,而不是主手指。

    使用this method 填写描述第二次按下的 ACTION_POINTER_DOWN 的所有必要信息。 确保传递正确的pointerProperties

    【讨论】:

      【解决方案4】:

      这是一个旧线程,但是因为没有一个答案是完整的,所以在这里为未来的人们添加更多信息。像作者一样,我想模拟两次触摸,即使我的序列是:

      ACTION_DOWN(0), PointerCount = 1
      ACTION_POINTER_DOWN(5), PointerCount = 2
      ACTION_POINTER_UP(6), PointerCount = 2
      ACTION_UP(1), PointerCount = 1
      

      这根本不起作用,我才明白,你需要通过指针计数来转移动作。

      if ((action == ACTION_POINTER_DOWN || action == ACTION_POINTER_UP) && pointerCount > 1)
         action |= 256 << (pointerCount - 2);
      

      换句话说,动作值变成了

      ACTION_DOWN(0), PointerCount = 1
      ACTION_POINTER_DOWN(261), PointerCount = 2
      ACTION_POINTER_UP(262), PointerCount = 2
      ACTION_UP(1), PointerCount = 1
      

      直到那时它才开始为我工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-24
        • 1970-01-01
        • 2015-07-21
        相关资源
        最近更新 更多