안드로이드 단말기의 화면이 아닌 다른 입력값을 따라, 코드로 입력을 제어하고자 했는데
생각보다 리소스가 없어서 고생을 했다.
그러다 테스트에 성공한 소스를 찾았는데, 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) 다음 터치를 인식하는 것은 일반적으로 손으로 기기를 제어할때와
마찬가지로 생각해보면 쉽게 이해할 수 있을것이다.
<참고>
'ANDROID' 카테고리의 다른 글
[안드로이드] ViewPager를 사용하는 swipe view에서 페이지 다시 생성을 방지하기 (0) | 2018.06.22 |
---|---|
[안드로이드] 기기의 GPS 정보를 따라 위도, 경도를 가져오기 (FusedLocationProviderClient) (0) | 2018.05.29 |
[안드로이드] 구글맵 객체를 참조해 onMapReady 함수 외부에서 제어하기 (0) | 2018.05.15 |
[안드로이드] TabbedActivity에서 각 Fragment의 레이아웃 구성요소 설정 및 제어 (0) | 2018.04.24 |
[안드로이드] Swipe View 적용을 위한 TabbedActivity 생성 및 풀스크린 레이아웃 적용 (0) | 2018.04.19 |