1

我需要模拟多点触控事件(缩放、平移等)以用于 Android 应用程序的仪器测试。一种方法是手动生成模拟真实输入的MotionEvent的相应序列,然后一个一个地调度它们。在我这样做之前,是否有一些很好的 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 
  }
}
4

2 回答 2

0

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

于 2013-05-18T17:14:40.503 回答
0

MotionEvent的文档中获取:

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

事件序列是第一个联系人的 ACTION_DOWN,然后是 ACTION_POINTER_X_DOWN 或 ACTION_POINTER_X_UP,因为添加或删除了新联系人,直到您最终拥有最后一个 ACTION_UP 事件来“解除”最后一个联系人。

(actionId, 指针计数)
ACTION_DOWN, 1 // 初始联系
ACTION_POINTER_2_DOWN, 2
ACTION_MOVE, 2 // 生成一个两点触控拖动/缩放事件
ACTION_POINTER_2_UP,2
ACTION_UP, 1

我基于这篇 SO 帖子:如何为 Android 测试生成缩放/捏合手势

于 2013-06-11T14:13:26.713 回答