Touch
안드로이드에서는 모든 행동이 Touch로 인해 이루어집니다.
기본적으로 Activity를 통해 화면을 구성하며, 사용자는 화면을 터치함으로써 애플리케이션에 다양한 이벤트를 전달할 수 있습니다.
ViewGroup에서 터치 이벤트 관리 | Android 개발자 | Android Developers
ViewGroup에서 터치 이벤트 관리 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. ViewGroup에서 터치 이벤트를 처리할 때는 특별히 주의해야 합니다. 왜냐하면 View
developer.android.com
MotionEvent
Touch의 모든 행동은 MotionEvent에 보고됩니다.
MotionEvent에는 4가지의 Action이 있습니다.
여기서 제스쳐는 Touch가 모여 해석된 동작을 뜻합니다. (줌인, 줌아웃, 스크롤 등)
- ACTION_DOWN : 손가락이 화면에 처음 닿을때. 제스처의 첫 포지션이 들어갑니다.
- ACTION_UP : 제스처의 최종 릴리즈 포지션을 나타냅니다.
- ACTION_MOVE : ACTION_DOWN과 ACTION_UP 사이의 모든 움직임을 반환합니다. 초기 위치와 최종 위치가 다를 경우에 나타납니다.
- ACTION_CANCEL : 현재 제스처가 취소당했을 경우에 해당합니다. 부모 뷰가 자식 뷰의 이벤트를 가로채는 경우에 발생합니다.
MotionEvent | Android Developers
developer.android.com
Touch Event 처리
Touch Event가 발생하면 Top down 방식으로 이벤트가 발생합니다.
가장 루트인 Activity부터 시작해서 intercept 당하지 않는다면 그 다음으로 넘어가게 됩니다.
즉, Activity -> ViewGroup A -> ViewGroup B -> View 순으로 전달하게 됩니다.
이벤트를 받은 View에서 Touch Event에 대한 처리를 수행하겠다고 하면, 이번에는 반대로 View -> ViewGroup B -> ViewGroup A -> Activity 순으로 이벤트 처리를 전달하게 됩니다.
Activity의 dispatchTouchEvent()를 통해 자식 뷰인 ViewGroup A에게 이벤트 알림이 가고, ViewGroup A에서 onInterceptTouchEvent()를 먼저 실행하여 인터셉트 여부를 확인한 다음에 false일 경우에만 다시 자식 뷰인 ViewGroup B에게 알림을 전달하게 됩니다.
만약 onInterceptTouchEvent()를 Override하여 true를 리턴하게 구현한다면, 해당 뷰그룹에서 더 이상 자식 뷰에게 터치 이벤트를 전달하지 않게 됩니다.
여기서 onInterceptTouchEvent()는 ViewGroup에 정의된 함수입니다.
따라서, Activity에서는 dispatchTouchEvent()를 Override하여 인터셉트에 대한 처리를 구현해야 합니다.
위의 그림에서 맨 밑의 View를 보면 OnTouchListener가 있을 경우와 없을 경우가 있습니다.
만약 View에 TouchListener를 등록해 놓았다면 리스너의 onTouch()가 처리되고, TouchListener가 따로 등록되어있지 않다면 View 클래스에 기본적으로 구현되어있는 onTouchEvent()가 호출됩니다.
class CustomLayout(context: Context) : FrameLayout(context) {
override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
return super.dispatchTouchEvent(event)
}
override fun onInterceptTouchEvent(event: MotionEvent?): Boolean {
return super.onInterceptTouchEvent(event)
}
override fun onTouchEvent(event: MotionEvent?): Boolean {
return super.onTouchEvent(event)
}
}
'안드로이드 > 개념' 카테고리의 다른 글
[Android] LiveData (0) | 2023.10.09 |
---|---|
[Android] ViewBinding과 DataBinding (0) | 2023.10.08 |
[Android] @JvmOverloads (0) | 2023.08.06 |
[Android] Broadcast Receiver (0) | 2023.08.01 |
[Android] Service (0) | 2023.08.01 |