Reputation: 4349
MotionEvent doesn't get a constructor, I wanted to manually create a MotionEvent in my unit test, then how to get that? Thanks.
Upvotes: 64
Views: 59054
Reputation: 511836
Here is an example illustrating the accepted answer:
// 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();
KeyEvent.META_SHIFT_ON
, etc.Upvotes: 25
Reputation: 19220
You should use one of the static obtain
methods of the MotionEvent
class to create a new event.
The simplest way (besides wrapping a new event from an existing one) is:
static public MotionEvent obtain(long downTime, long eventTime, int action,
float x, float y, int metaState) {
API Docs:
Create a new MotionEvent, filling in a subset of the basic motion values. Those not specified here are: device id (always 0), pressure and size (always 1), x and y precision (always 1), and edgeFlags (always 0).
Parameters:
downTime
The time (in ms) when the
user originally pressed down to start
a stream of position events. This
must be obtained from
SystemClock.uptimeMillis().eventTime
The the time (in ms) when
this specific event was generated.
This must be obtained from
SystemClock.uptimeMillis()
.action
The kind of action being
performed -- one of either
ACTION_DOWN
, ACTION_MOVE
,
ACTION_UP
, or ACTION_CANCEL
.x
The X coordinate of this event.y
The Y coordinate of this event.metaState
The state of any meta /
modifier keys that were in effect
when the event was generated.Upvotes: 105