Android:如何创建MotionEvent?

fif*_*fth 52 events android

MotionEvent没有得到构造函数,我想在单元测试中手动创建一个MotionEvent,然后如何获得它?谢谢.

rek*_*eru 92

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

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

static public MotionEvent obtain(long downTime, long eventTime, int action,
        float x, float y, int metaState) {
Run Code Online (Sandbox Code Playgroud)

API文档:

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

参数:

  • downTime用户最初按下以开始位置事件流的时间(以毫秒为单位).这必须从SystemClock.uptimeMillis()获得.
  • eventTime生成此特定事件的时间(以毫秒为单位).这必须从中获得 SystemClock.uptimeMillis().
  • action正在执行的动作的类型-中的任何一个 ACTION_DOWN,ACTION_MOVE, ACTION_UP,或ACTION_CANCEL.
  • x 此事件的X坐标.
  • y 此事件的Y坐标.
  • metaState 生成事件时生效的任何元/修饰键的状态.

链接到API文档

  • 当你完成它们时,你应该总是在你获得的MotionEvents上调用`recycle`,对吧?(对于单元测试可能并不重要.)我猜它们存储在一个对象池中,获取和回收就像是新的和删除一样. (12认同)
  • @ xwz7611不需要它(基本上,`MotionEvent在幕后有一个原始对象缓存,`recycle()`告诉事件将自己存储在缓存中以便重用),但如果你不使用它您可能会获得额外的开销,因为每次获得`MotionEvent`时,VM都必须分配和构造一个新对象.(由于回收事件仍占用空间,因此存在一些内存权衡,但只要你不是一次性创建一大堆`MotionEvent并且定期发送它们,那就不应该是问题).`ListView`行自动执行相同的操作. (3认同)

Sur*_*gch 11

补充答案

以下是一个说明已接受答案的示例:

// 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);
Run Code Online (Sandbox Code Playgroud)

笔记