以编程方式触发ACTION_POINTER_DOWN事件

时间:2016-10-20 11:29:36

标签: android android-touch-event

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

我想触发同一个事件,当用户将两个手指放下并在那里按住手指几毫秒时调用该事件。

3 个答案:

答案 0 :(得分:1)

Documentation说:"手势以ACTION_DOWN的动作事件开始,提供第一个指针向下的位置。当每个附加指针向下或向上时,框架将相应地生成带有ACTION_POINTER_DOWN或ACTION_POINTER_UP的运动事件。"所以你首先需要触发简单的触摸事件。并查看this问题。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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]