android - 如何使用android-Instrumentation来拖动?
问题描述
这是我的功能。它可以工作但不能设置速度。我不知道这是否是正确的使用方法。
那么,实现拖动的正确方法是什么?
public static void drag(final int start_x, final int start_y, final int end_x, final int end_y) {
mInst = new Instrumentation();
//key down
mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, start_x, start_y, 0));
//move
mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE, start_x, start_y, 0));
mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE, end_x, end_y, 0));
//key up
mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, end_x, end_y, 0));
}
解决方案
public static void drag(float x1, float y1, float x2, float y2, float duration) {
final int interval = 25;
int steps = (int) (duration * 1000 / interval + 1);
float dx = (x2 - x1) / steps;
float dy = (y2 - y1) / steps;
down(x1, y1);
for (int step = 0; step < steps; step++) {
SystemClock.sleep(interval);
moveTo(x1 + step * dx, y1 + step * dy, 0);
}
SystemClock.sleep(interval);
up(x2, y2);
}
private static void down(float x, float y) {
if (Robot.mInst == null) {
mInst = new Instrumentation();
}
mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0));
}
private static void up(float x, float y) {
if (Robot.mInst == null) {
mInst = new Instrumentation();
}
mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0));
}
private static void moveTo(float x, float y, int contactId) {
if (Robot.mInst == null) {
mInst = new Instrumentation();
}
mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE, x, y, 0));
}
有用!
推荐阅读
- java - 在运行时禁用/启用对 Vaadin 8 网格的拖放支持
- c# - 如何将 JSON 对象转换为数组
- autosar - AUTOSAR 是否包含开箱即用的组件
- linux - shell 脚本无法在 eclipse che 中创建工作区
- c# - C# 使用 Office.Interop 设置数据透视表的 TableStyle
- spring - CannotLoadBeanClassException:找不到名称在 ServletContext 资源 [/WEB-INF/sping-servlet.xml] 中定义的 bean 的类
- excel - 如何通过激活另一个工作簿中的宏来更改工作簿的全局变量
- c - 在C中访问多维字符串数组的元素
- javascript - SAPUI5 StandardListItem 按选定排序
- r - ggplot中标题行的水平调整不等