0

想要触发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));

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

4

4 回答 4

1

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

于 2016-10-20T11:51:29.733 回答
1

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

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

使用此方法填写描述第二次按下的 ACTION_POINTER_DOWN 的所有必要信息。确保正确通过pointerProperties

于 2016-10-31T09:29:01.307 回答
1

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

为此,请使用此处MotionEvent obtain记录的支持多指针的变体。

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. 指针计数 = 2
  2. 指针属性 = [firstFingerPointerProperties, secondFingerPointerProperties]
  3. pointerCoords = [firstFingerPointerCoords, secondFingerPointerCoords]
于 2016-10-31T12:05:10.713 回答
0

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

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

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

于 2021-09-10T12:29:22.017 回答