MotionEvent没有构造函数,我想在我的单元测试中手动创建一个MotionEvent,请问该如何获取?谢谢。
你应该使用 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_DOWN
、ACTION_MOVE
、ACTION_UP
或ACTION_CANCEL
。x
此事件的X坐标。y
此事件的Y坐标。metaState
事件生成时任何元/修饰键的状态。这里有一个例子,说明了被接受的答案:
// 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();
obtain
获得的 MotionEvent 后,你应该始终调用recycle
进行回收,对于单元测试可能不太重要。我猜它们被存储在一个对象池中,obtain
和recycle
就像是 new 和 delete。 - idbriirecycle()
方法(基本上,MotionEvent
在后台具有原始对象缓存,并且recycle()
告诉事件将自己存储在缓存中以便重用),但如果您不使用它,则可能会增加额外的开销,因为每次获取MotionEvent
时VM都必须分配和构造一个新对象。(回收的事件确实仍然占用空间,但只要您不同时创建大量MotionEvent
并且定期调度它们,这就不应该成为问题)ListView
行会自动执行相同的操作。 - JAB