Android: 如何创建一个 MotionEvent?

63
MotionEvent没有构造函数,我想在我的单元测试中手动创建一个MotionEvent,请问该如何获取?谢谢。
2个回答

104

你应该使用 MotionEvent 类的静态 obtain 方法之一来创建新事件。

最简单的方法(除了从现有事件包装一个新事件)是:

static public MotionEvent obtain(long downTime, long eventTime, int action,
        float x, float y, int metaState) {

API文档:

创建一个新的 MotionEvent,填充基本运动值的子集。这里未指定的是设备ID(始终为0),压力和大小(始终为1),x和y精度(始终为1)以及edgeFlags(始终为0)。

参数:

  • downTime 用户最初按下开始产生位置事件的时间(以毫秒为单位)。必须从SystemClock.uptimeMillis()获取。
  • eventTime 生成此特定事件的时间(以毫秒为单位)。必须从SystemClock.uptimeMillis()获取。
  • action 执行的操作类型--其中之一为ACTION_DOWNACTION_MOVEACTION_UPACTION_CANCEL
  • x 此事件的X坐标。
  • y 此事件的Y坐标。
  • metaState 事件生成时任何元/修饰键的状态。

API文档链接


13
在使用完 obtain 获得的 MotionEvent 后,你应该始终调用 recycle 进行回收,对于单元测试可能不太重要。我猜它们被存储在一个对象池中,obtainrecycle 就像是 new 和 delete。 - idbrii
1
有人能确认是否一定需要回收吗?我在 SDK 文档中没有看到这个。 - xwz7611
3
不需要调用recycle()方法(基本上,MotionEvent在后台具有原始对象缓存,并且recycle()告诉事件将自己存储在缓存中以便重用),但如果您不使用它,则可能会增加额外的开销,因为每次获取MotionEvent时VM都必须分配和构造一个新对象。(回收的事件确实仍然占用空间,但只要您不同时创建大量MotionEvent并且定期调度它们,这就不应该成为问题)ListView行会自动执行相同的操作。 - JAB
1
我该如何设置工具类型来模拟鼠标光标? - Fernando Gallego

24

补充回答

这里有一个例子,说明了被接受的答案:

// get the coordinates of the view
int[] coordinates = new int[2];
myView.getLocationOnScreen(coordinates);

// MotionEvent parameters
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis();
int action = MotionEvent.ACTION_DOWN;
int x = coordinates[0];
int y = coordinates[1];
int metaState = 0;

// dispatch the event
MotionEvent event = MotionEvent.obtain(downTime, eventTime, action, x, y, metaState);
myView.dispatchTouchEvent(event);
event.recycle();

注释


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接