Android/Java
[Android] onTouchEvent - 터치 이벤트 흐름
LeeeGi
2019. 2. 28. 10:56
반응형
뷰의 터치 이벤트 처리방법 3가지
- 액티비티에서 onTouchEvent 메서드 재정의
- 이벤트 처리하는 뷰 서브클래스에서 onTouchEvent 메서드 재정의
- 처리하고자 하는 뷰에 View.OnTouchListener 리스너 인터페이스를 등록
* 이벤트 처리의 흐름
- 액티비티에서의 이벤트 처리
액티비티 >> onTouchEvent 메서드를 재정의 >> 모든 뷰의 터치이벤트를 받을 수 있음
- 뷰에서 이벤트 처리
onTouchEvent 메서드를 재정의 >> 상속, 서브클래스 = 번거로움
or
OnTouchListener 인터페이스를 등록 >> 인터페이스를 구현한 메서드에서 터치이벤트를 받음, 상속 x
>>> 해당 뷰의 이벤트만 처리
- 2가지 다 구현되어 있다면?
OnTouchListener의 메서드(onTouch) >> onTouchEvent 순서로 호출
onTouch 메서드가 true를 리턴? >> onTouchEvent는 이벤트를 받지 못함
Activity(dispatchTouchEvent) : 하위 dispatchTouchEvent 호출
ViewGroup(dispatchTouchEvent) : onInterceptTouchEvent 호출
ViewGroup(onInterceptTouchEvent) : 하위 dispatchTouchEvent 호출
View(dispatchTouchEvent) : 자신의 이벤트 핸들러 메서드 호출
View(onTouch) : 이벤트 처리 & 처리여부 리턴
View(onTouchEvent) : 이벤트 처리 & 처리여부 리턴
View(dispatchTouchEvent) : 자신의 이벤트 핸들러 메서드의 결과값을 리턴
ViewGroup(onTouch) : 이벤트 처리 & 처리여부 리턴
ViewGroup(onTouchEvent) : 이벤트 처리 & 처리여부 리턴
ViewGroup(dispatchTouchEvent) : 자신 or 하위 레이어의 결과값을 리턴
Activity(onTouchEvent) : 이벤트 처리 & 처리여부 리턴
Activity(dispatchTouchEvent) : 자신 or 하위 레이어의 결과값을 리턴
- Aictivity/ViewGroup/View는 모두 dispatchTouchEvent, onTouchEvent 메서드를 가짐
- ViewGroup에는 추가적으로 onInterceptTouchEvent 메서드를 가짐
- 이벤트가 발생하면 각 레이어의 dispatchTouchEvent가 가장 먼저 호출 >>
dispatchTouchEvent는 하위 레이어의 dispatchTouchEvent를 호출
하위 레이어가 터치 이벤트를 처리했는지 결과를 받아서 처리하지 않은 경우 >>
자기 자신의 이벤트 처리 메서드(onTouch, onTouchEvent) 메서드로 이벤트를 보냄 >>
이벤트 처리 여부를 상위 dispatchTouchEvent에 리턴
- onInterceptTouchEvent는 ViewGroup의 dispatchTouchEvent의 로직을 대신 담당하여, 자신에게 속한 하위뷰에게 이벤트를 전달할지 결정한다.
- 모든 메서드는 리턴값이 boolean형인데 true일 경우 이벤트를 처리했음을 의미하고, false일 경우 이벤트가 처리되지 않았음을 의미한다.
* onInterceptTouchEvent
- true : 이벤트를 가져옴
- false : 하위 View로 이벤트를 전달
* 참조
http://dktfrmaster.blogspot.com/2016/09/blog-post_26.html
https://iw90.tistory.com/238
반응형