본문 바로가기

ANDROID

[안드로이드] 터치이벤트를 수동으로 생성해 입력하기

안드로이드 단말기의 화면이 아닌 다른 입력값을 따라, 코드로 입력을 제어하고자 했는데 

 

생각보다 리소스가 없어서 고생을 했다.

 

그러다 테스트에 성공한 소스를 찾았는데, MotionEvent 를 활용하여 손으로 화면을 터치했을때와 비슷하게

 

터치를 코드로 시뮬레이션 할 수 있는것을 알 수 있었다.

 

먼저 아래와 같은 소스를 이벤트를 생성하는데 사용하고자 하는 함수로 생성해준다.

 

넘겨주는 인자는 터치를 어느 x, y 좌표에 넣을 것인것과 MotionEvent를 어떤 것으로 넣을것인가 정도를 지정해 주면 된다.

 

 

// Obtain MotionEvent object
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis() + 100;
float x = 0.0f;
float y = 0.0f;
// List of meta states found here:     developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
int metaState = 0;
MotionEvent motionEvent = MotionEvent.obtain(
    downTime, 
    eventTime, 
    MotionEvent.ACTION_UP, 
    x, 
    y, 
    metaState
);

// Dispatch touch event to view
view.dispatchTouchEvent(motionEvent);

 

중요한건 Motion 이벤트를 어떻게 배치하냐인데, 

 

손가락으로 화면을 터치한다 -> 터치한 상태로 손가락을 움직인다 -> 움직인 부분에서 손가락을 뗀다 라는 터치 동작의 과정을

 

 

MotionEvent.ACTION_DOWN -> MotionEvent.ACTION_MOVE -> MotionEvent.ACTION_UP

 

 

을 통해 구성해야만 한다. 단순하게 화면을 터치하는 것과 터치한 채로 손가락을 이동할때를

 

다른 MotionEvent로 구분하고 있으므로, 위의 MotionEvent가 순차적으로 이뤄져야만 

 

다음 터치 이벤트를 만들고자 할때 문제없이 진행할 수 있을 것이다. 

 

손이 떼어져야(MotionEvent.ACTION_UP) 다음 터치를 인식하는 것은 일반적으로 손으로 기기를 제어할때와

 

마찬가지로 생각해보면 쉽게 이해할 수 있을것이다.

 

 

<참고>

 

https://stackoverflow.com/questions/23902892/how-to-programmatically-trigger-the-touch-event-in-android