我需要模拟多点触控事件(缩放,平移等),以便在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
}
}
答案 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