jaehwa

jaehwa.egloos.com

포토로그 마이가든



Android Touch Event Flow 분석 안드로이드 SDK

Touch Event Flow 분석

안드로이드 UI 관련 구현에 앞서서 Activity, ViewGroup, View 간의 이벤트 흐름에 대해서 명확히 하고 넘어가기 위해서 몇가지 테스트를 해보았습니다. 아래 문서에는 터치 이벤트를 사용하는데 있어서 전체적인 흐름과 주의 사항을 정리하려고 합니다.

간단 용어 정리

  1. Activity : 한 화면(사용자 인터페이스)를 담당하는 객체, 여러개의 ViewGrop 과 여러개의 View들을 가질 수 있다.
  2. ViewGroup(Layout) : View 객체들을 모을 수 있다.
  3. View : 하나의 콘트롤을 구성하게 된다. 예로 버튼, 텍스트 박스 ... 등이 View 해당한다.

Touch 관련 이벤트

  • 기본적으로 아래의 두 메서드를 구현할 수 있다. (Activity, ViewGroup, View 모두 아래 두 메서드를 상속받아 구현할 수 있다.)
    public boolean dispatchTouchEvent(MotionEvent event);public boolean onTouchEvent(MotionEvent event);
  • Touch 이벤트 발생 순서
    1. Case (1)
      Activity (dispatchTouchEvent)   -> ViewGroup(dispatchTouchEvent)      -> View(dispatchTouchEvent)       -> View(onTouchEvent:return false)         -> ViewGroup(onTouchEvent:return false)           -> View(onTouchEvent:return false)
    2. Case (2)
      Activity (dispatchTouchEvent)   -> ViewGroup(dispatchTouchEvent)      -> View(dispatchTouchEvent)       -> View(onTouchEvent:return false)         -> ViewGroup(onTouchEvent:return true) 
    • onTouchEvent 에서 리턴 false를 하면 더 이상 이벤트를 흘리지 않는다.
    • 이벤트 순서 흐름 (Case 1)
      1. Activity dispatchTouchEvent Start
        1. Layout dispatchTouchEvent Start
          1. View dispatchTouchEvent Start
            1. View OnTouch (return false)
          2. View dispatchTouchEvent End(return false)
          3. Layout OnTouch(return false)
        2. Layout dispatchTouchEvent End(return false)
        3. Activity OnTouch(return false)
      2. Activity dispatchTouchEvent End(return false)
    • 이벤트 순서 흐름 (Case 2)
      1. Activity dispatchTouchEvent Start
        1. Layout dispatchTouchEvent Start
          1. View dispatchTouchEvent Start
            1. View OnTouch (return false)
          2. View dispatchTouchEvent End(return false)
          3. Layout OnTouch(return true)
        2. Layout dispatchTouchEvent End(return true)
      2. Activity dispatchTouchEvent End(return true)
  • 핵심사항
    • Activity 에서 먼저 이벤트를 처리하고 싶다면 dispatchTouchEvent 이벤트를 상속받아 구현한다.
    • 단 구현시, dispatchTouchEvent 안에 super.dispatchTouchEvent()를 호출해야만 onTouch 에서 이벤트를 받을 수 있으므로 지워서는 안된다.
    • onTouch Event 전에 dispatch Event에서 처리하려면 꼭 super.dispathchTouchEvent()를 호출하기전에 구현한다.
      • 사용예, super.dispatchTouchEvent 전에 처리해야 하면 할 수 있는데 뒤에 적용시 문제가 되므로 주의하기바란다.
    • dispatchTouchEvent 리턴은 꼭 super.dispatchTouchEvent 의 리턴값으로 리턴해야 한다. onTouch 의 리턴값이 super.dispathTouchEvent의 값이라서 전체적인 이벤트 흐름에 영향을 주게 된다.
      @Overridepublic boolean dispatchTouchEvent(MotionEvent event) {  
          boolean bReturn = false;
          ...//1. onDraw 전에 선처리 기능 구현
          bReturn = super.dispatchTouchEvent(event); // 2. 이 함수를 타게 되면서 onTouchEvent 들이 호출
          ..//3. onDraw 이후 처리하는 기능 구현
         return bRetrun;
      }

공유하기 버튼

 

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://jaehwa.egloos.com/tb/986223 [도움말]

덧글

  • 재형 2011/03/24 16:50 # 삭제 답글

    대단하십니다. 터치이벤트의 플로우를 이렇게 분석하시다니.. 멋지세요~
    한가지 더 궁금한 것은 super.dispatchTouchEvent 가 뭘하는지 궁금하네요.
    구글의 문서는 너무 간단히 나와서... 저런 터치이벤트와의 관계도 안나와있고,
    쌩으로 하다가.. 짜증 났는데... 무지무지 감사합니다.
  • 재형 2011/03/24 17:04 # 삭제 답글

    그런데 한가지 onTouchEvent 에서 리턴 false가 아니라, 리턴 true를 해야
    다음으로 이벤트를 흘리지 않는 것 같습니다. => true는 내가 처리했다는 뜻이라고
    구글 문서에 있고 실제 해보니 그런 것 같구요.
  • 옛날꿀호떡 2012/03/28 15:08 # 삭제 답글

    좋은 내용 감사합니다.
    하지만 내용이 짤리네요..
    case1.. case2... 부분이요..
    복사해서 워드에 붙여넣기 해서 봤습니다.
댓글 입력 영역



애드센스 광고

애드센스 광고(링크단위)