【发布时间】:2011-05-03 08:40:03
【问题描述】:
MotionEvent 没有构造函数,我想在我的单元测试中手动创建一个 MotionEvent,那么如何获得呢?谢谢。
【问题讨论】:
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任何元的状态/
有效的修饰键
事件的生成时间。【讨论】:
obtain 的 MotionEvents 上调用 recycle,对吗? (可能对单元测试并不重要。)我猜它们存储在对象池中,获取和回收就像 new 和 delete。
MotionEvents 在后台有一个原始对象缓存,recycle() 告诉事件将自己存储在缓存中以供重用),但是如果如果您不使用它,您可能会获得额外的开销,因为每次您获得MotionEvent 时,VM 都必须分配和构造一个新对象。 (有一点内存权衡,因为回收的事件仍然占用空间,但只要你不一次创建一大堆 MotionEvents 并且定期调度它们,那不应该是问题)。 ListView rows 自动执行相同的操作。
这是一个说明接受答案的示例:
// 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);
KeyEvent.META_SHIFT_ON 等内容。【讨论】: