Android:如何创建MotionEvent?

Android:如何创建MotionEvent?,android,events,Android,Events,MotionEvent没有获得构造函数,我想在单元测试中手动创建一个MotionEvent,那么如何获得它呢?谢谢。您应该使用MotionEvent类的一个静态get方法来创建新事件 最简单的方法(除了从现有事件包装新事件外)是: API文档: 创建一个新的MotionEvent,填充 基本运动值的子集。 此处未指定的是:设备 id(始终为0)、压力和尺寸 (始终为1)、x和y精度(始终为 1) ,和边间隙(始终为0) 参数: 停机时间停机时间 用户最初按下启动按钮 一连串的位置事件。这 必须

MotionEvent没有获得构造函数,我想在单元测试中手动创建一个MotionEvent,那么如何获得它呢?谢谢。

您应该使用
MotionEvent
类的一个静态
get
方法来创建新事件

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

API文档

创建一个新的MotionEvent,填充 基本运动值的子集。 此处未指定的是:设备 id(始终为0)、压力和尺寸 (始终为1)、x和y精度(始终为 1) ,和边间隙(始终为0)

参数

  • 停机时间
    停机时间 用户最初按下启动按钮 一连串的位置事件。这 必须从 SystemClock.uptimeMillis()
  • eventTime
    此特定事件已生成。 这必须从以下地址获得:
    SystemClock.uptimeMillis()
  • 动作
    正在执行的动作类型 执行--其中一个
    动作下移
    动作下移
    操作启动
    ,或
    操作取消
  • x
    此事件的x坐标
  • y
    此事件的y坐标
  • 元状态
    任何元状态的状态/ 已生效的修改器关键点 当事件生成时

补充回答 下面是一个示例,说明了公认的答案:

// 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\u SHIFT\u ON
  • 感谢您对示例的帮助

当您处理完这些事件后,您应该始终调用
回收
来处理
获取的运动事件,对吗?(可能对单元测试不重要。)我猜它们存储在一个对象池中,获取和回收就像新建和删除一样。有人能确认回收是绝对必要的吗?未从SDK文档中看到此内容。@xwz7611不需要它(基本上,
MotionEvent
s在后台有一个基本对象缓存,并且
recycle()
告诉事件将自身存储在缓存中以供重用),但是如果不使用它,可能会增加额外的开销,因为每次获得
MotionEvent
时,虚拟机都必须分配和构造一个新对象。(有一点内存折衷,因为回收的事件仍然会占用空间,但只要您不是一次创建一大堆
MotionEvent
s,并且定期发送它们,这应该不会有问题)<代码>列表视图
行自动执行相同操作。如何将工具类型设置为假鼠标光标?
// 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);