Android: как создать MotionEvent?
MotionEvent не получает конструктор, я хотел вручную создать MotionEvent в моем модульном тесте, тогда как это получить? Благодарю.
2 ответа
Решение
Вы должны использовать один из статических obtain
методы MotionEvent
класс для создания нового события.
Самый простой способ (помимо переноса нового события из существующего):
static public MotionEvent obtain(long downTime, long eventTime, int action,
float x, float y, int metaState) {
Документы API:
Создайте новое MotionEvent, заполнив подмножество основных значений движения. Здесь не указаны: идентификатор устройства (всегда 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);
Заметки
- Другие мета-состояния включают в себя такие вещи, как
KeyEvent.META_SHIFT_ON
, так далее. - Спасибо за этот ответ за помощь с примером.