how to generate zoom/pinch gesture for testing for Android
来源:互联网 发布:南航 java岗位 编辑:程序博客网 时间:2024/06/04 19:25
well, i have found the issue.
ISSUE:
When using the obtain() API, we have to set the pressure and size of the points in each event.
For
obtain(long, long, int, int, android.view.MotionEvent.PointerProperties[], android.view.MotionEvent.PointerCoords[], int, int, float, float, int, int, int, int)
the PointerCoords[], we have to set the pressure and size to 1, the default values are 0.
For
public static MotionEvent obtain (long downTime, long eventTime, int action, float x, float y, int metaState) Create a new MotionEvent, filling in a subset of the basic motion values. Those not specified here are: device id (always 0), pressure and size (always 1), x and y precision (always 1), and edgeFlags (always 0).since the default pressure and size are 1, so we don't need to set them.
My tips for creating gestures:
1. following the real gesture sequence, since we want to simulate the real gestures
override the onTouchEvent() to check the real events received by application. These events can also be used for comparison of real user touch events and generated touch events Take browser for example:
a) @Override public boolean onTouchEvent(MotionEvent event) { Log.i("WebView", event.toString() + event.getAction()); boolean rt = super.onTouchEvent(event); return rt; }
manually touch screen to get the real gesture sequence from onTouchEvent() in a). We can follow the event sequence when generating events. -- If we don’t follow the gesture event sequence, the instrumented events may be rejected.
Here is a valid event sequence of zoom gesture, (the downTime is the same for all the events)
i. ACTION_DOWN of one start point
ii. ACTION_POINTER_2_DOWN of two start points
iii.ACTION_MOVE of two middle points
iv. ACTION_POINTER_2_UP of two end points
v. ACTION_UP of one end point
2. use the API MotionEvent.obtain correctly
- There are two most used obtain() API.
public static MotionEvent obtain (long downTime, long eventTime, int action, float x, float y, int metaState)
AND
public static MotionEvent obtain(long, long, int, int, android.view.MotionEvent.PointerProperties[], android.view.MotionEvent.PointerCoords[], int, int, float, float, int, int, int, int)
The first one is usually used for single point gestures, like fling, scroll, click etc. The parameters (pressure, size, xPresion, yPresion) for this function are all set to 1.
And the second one is a more general one, and can be used for multi-touch events generation. While for the second one, we have to set the pressure, size in pointerCoords of each touch point to 1.
Here is the example to generate the zoom gesture:
public static void generateZoomGesture(Instrumentation inst, long startTime, boolean ifMove, GestureInfo.Point startPoint1, GestureInfo.Point startPoint2, GestureInfo.Point endPoint1, GestureInfo.Point endPoint2, int duration) { if (inst == null || startPoint1 == null || (ifMove && endPoint1 == null)) { return; } long eventTime = startTime; long downTime = startTime; MotionEvent event; float eventX1, eventY1, eventX2, eventY2; eventX1 = startPoint1.x; eventY1 = startPoint1.y; eventX2 = startPoint2.x; eventY2 = startPoint2.y; // specify the property for the two touch points PointerProperties[] properties = new PointerProperties[2]; PointerProperties pp1 = new PointerProperties(); pp1.id = 0; pp1.toolType = MotionEvent.TOOL_TYPE_FINGER; PointerProperties pp2 = new PointerProperties(); pp2.id = 1; pp2.toolType = MotionEvent.TOOL_TYPE_FINGER; properties[0] = pp1; properties[1] = pp2; //specify the coordinations of the two touch points //NOTE: you MUST set the pressure and size value, or it doesn't work PointerCoords[] pointerCoords = new PointerCoords[2]; PointerCoords pc1 = new PointerCoords(); pc1.x = eventX1; pc1.y = eventY1; pc1.pressure = 1; pc1.size = 1; PointerCoords pc2 = new PointerCoords(); pc2.x = eventX2; pc2.y = eventY2; pc2.pressure = 1; pc2.size = 1; pointerCoords[0] = pc1; pointerCoords[1] = pc2; ////////////////////////////////////////////////////////////// // events sequence of zoom gesture // 1. send ACTION_DOWN event of one start point // 2. send ACTION_POINTER_2_DOWN of two start points // 3. send ACTION_MOVE of two middle points // 4. repeat step 3 with updated middle points (x,y), // until reach the end points // 5. send ACTION_POINTER_2_UP of two end points // 6. send ACTION_UP of one end point ////////////////////////////////////////////////////////////// // step 1 event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, 1, properties, pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0 ); inst.sendPointerSync(event); //step 2 event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_POINTER_2_DOWN, 2, properties, pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0); inst.sendPointerSync(event); //step 3, 4 if (ifMove) { int moveEventNumber = 1; moveEventNumber = duration / EVENT_MIN_INTERVAL; float stepX1, stepY1, stepX2, stepY2; stepX1 = (endPoint1.x - startPoint1.x) / moveEventNumber; stepY1 = (endPoint1.y - startPoint1.y) / moveEventNumber; stepX2 = (endPoint2.x - startPoint2.x) / moveEventNumber; stepY2 = (endPoint2.y - startPoint2.y) / moveEventNumber; for (int i = 0; i < moveEventNumber; i++) { // update the move events eventTime += EVENT_MIN_INTERVAL; eventX1 += stepX1; eventY1 += stepY1; eventX2 += stepX2; eventY2 += stepY2; pc1.x = eventX1; pc1.y = eventY1; pc2.x = eventX2; pc2.y = eventY2; pointerCoords[0] = pc1; pointerCoords[1] = pc2; event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, 2, properties, pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0); inst.sendPointerSync(event); } } //step 5 pc1.x = endPoint1.x; pc1.y = endPoint1.y; pc2.x = endPoint2.x; pc2.y = endPoint2.y; pointerCoords[0] = pc1; pointerCoords[1] = pc2; eventTime += EVENT_MIN_INTERVAL; event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_POINTER_2_UP, 2, properties, pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0); inst.sendPointerSync(event); // step 6 eventTime += EVENT_MIN_INTERVAL; event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, 1, properties, pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0 ); inst.sendPointerSync(event);}
In order to make the above code work with non-deprecated constants I used MotionEvent.ACTION_POINTER_DOWN + (pp2.id << MotionEvent.ACTION_POINTER_INDEX_SHIFT)
instead of MotionEvent.ACTION_POINTER_2_DOWN
So I had to replace this line:
event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_POINTER_2_DOWN, 2, properties, pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0);
with
event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_POINTER_DOWN + (pp2.id << MotionEvent.ACTION_POINTER_INDEX_SHIFT), 2, properties, pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0);
In order to make the above code work with non-deprecated constants I used MotionEvent.ACTION_POINTER_DOWN + (pp2.id << MotionEvent.ACTION_POINTER_INDEX_SHIFT)
instead of MotionEvent.ACTION_POINTER_2_DOWN
So I had to replace this line:
event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_POINTER_2_DOWN, 2, properties, pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0);
with
event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_POINTER_DOWN + (pp2.id << MotionEvent.ACTION_POINTER_INDEX_SHIFT), 2, properties, pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0);
- how to generate zoom/pinch gesture for testing for Android
- How to generate response for AHB Slave VIP
- How to generate exe for your PERL script?
- How to generate a selective deletion program for info provider
- How to make a automated testing for web applications
- How to Implement Push Notifications for Android
- How to Implement Push Notifications for Android
- How to new an emulator for Android?
- How to Build FFmpeg for Android
- How to build Android adb for ARM
- How to build Android adb for ARM .
- How to Build FFmpeg for Android
- How to Build FFmpeg for Android
- How To Design For Android Devices
- How to Build FFmpeg for Android
- How to Implement Push Notifications for Android
- How To Build CyanogenMod Android for smartphone
- How to get libreadline for Android?
- UVA - 10029 Edit Step Ladders
- 可拖动排序ListView和GridView
- hdu 2100 Lovekey
- sgu 141
- 3. print函数的一些问题
- how to generate zoom/pinch gesture for testing for Android
- 一个简单的死锁
- HDU 4267 经典树状数组
- 十三个经典算法研究与总结、目录+索引
- Android开发中关于Layout_weight的理解
- Android TileMode效果 水波纹效果 环形渐变
- 匿名函数和闭包
- Pav OpenCart 商城自适应主题模板 ABC-0013
- stm32时钟分析