Android: How to create a MotionEvent?

前端 未结 2 1196
粉色の甜心
粉色の甜心 2020-11-29 01:30

MotionEvent doesn\'t get a constructor, I wanted to manually create a MotionEvent in my unit test, then how to get that? Thanks.

相关标签:
2条回答
  • 2020-11-29 01:50

    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.

    Link to API Docs

    0 讨论(0)
  • 2020-11-29 01:50

    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.
    0 讨论(0)
提交回复
热议问题