Android: How to create a MotionEvent?
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 fromSystemClock.uptimeMillis()
. -
action
The kind of action being performed -- one of eitherACTION_DOWN
,ACTION_MOVE
,ACTION_UP
, orACTION_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.
Link to API Docs
Supplemental answer
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);
Notes
- Other meta states include things like
KeyEvent.META_SHIFT_ON
, etc. - Thanks to this answer for help with the example.