以编程方式在Android中模拟多点触控事件以进行测试

时间:2013-05-18 00:57:25

标签: android testing multi-touch

我需要模拟多点触控事件(缩放,平移等),以便在Android应用的测试测试中使用。一种方法是手动生成模仿真实输入的MotionEvent s的相应序列,然后逐个发送它们。在我这样做之前,是否有一些很好的API可以进行这样的模拟?我想过很多人过去都遇到过这个问题。我正在调查Robotium Solo,但它只为单个指针提供触摸/拖动。

如果没有这样的API,那么解决问题的最佳方法是什么?我正在考虑编写一个函数来接受每个参与指针的一对点(开始,结束)和持续时间,但这会将手势限制为线性指针运动。

public void twoFingerTouchEvent(
             Point from1, Point to1, int duration1, 
             Point from2, Point to2, int duration2) {

  if (from1.equals(to1) && from2.equals(to2)) { 
    // two pointer tap
    // DISPATCH_DOWN
    // DISPATCH_POINTER_DOWN
    // WAIT min(duration1, duration2)
    // DISPATCH_POINTER_UP
    // WAIT abs(duration1 - duration2)
    // DISPATCH_UP
  }
  else if (from1.equals(to1) || from2.equals(to2)) {
    // one of two pointers dragged after tap
    // DISPATCH_DOWN
    // DISPATCH_POINTER_DOWN
    // DISPATCH_MOVE for moving pointer every 3-5 pixels, account for duration
    // DISPATCH_POINTER_UP
    // DISPATCH_UP 
  }
  else {
    // two pointer drag
    // DISPATCH_DOWN
    // DISPATCH_POINTER_DOWN
    // DISPATCH_MOVE for both pointers in alternating order every 3-5 pixels
    // DISPATCH_POINTER_UP
    // DISPATCH_MOVE for pointer with longer duration
    // DISPATCH_UP 
  }
}

2 个答案:

答案 0 :(得分:0)

您应该使用MotionEvent#obtain - 它可以用于创建包含多个指针的MotionEvent。 您不仅限于线性指针运动 - 您可以传递点阵列并执行一个操作,然后执行x次操作并最终执行操作。

答案 1 :(得分:0)

摘自MotionEvent的文档:

对于API 9及更低版本,您将需要使用MotionEvent.ACTION_POINTER_X_DOWN / UP来指定哪个指针正在向上或向下。

事件序列是第一次接触的ACTION_DOWN,接着是ACTION_POINTER_X_DOWN或ACTION_POINTER_X_UP,因为新的联系人被添加或删除,直到你最后有最后一次ACTION_UP事件来“解除”最后一次接触。

(actionId, pointerCount)
ACTION_DOWN, 1 // initial contact
ACTION_POINTER_2_DOWN, 2
ACTION_MOVE, 2 // generate a two-touch drag/zoom event
ACTION_POINTER_2_UP, 2
ACTION_UP, 1

我基于这篇SO帖子:How to generate zoom/pinch gesture for testing for Android