Android 의 Touch 이벤트 처리 메커니즘 소개

안 드 로 이 드 의 터치 이벤트 처리 체 제 는 비교적 복잡 하 다.특히 여러 가지 터치 와 사건 차단 을 고려 한 후에.Android 의 Touch 이벤트 처 리 는 Activity 층,ViewGroup 층,View 층 으로 나 뉜 다.우선 터치 이벤트 처리 의 몇 가지 기본 규칙 을 말씀 드 리 겠 습 니 다.만약 어느 층 에서 ACTION 을 처리 하지 않 았 다 면DOWN 사건,그러면 이 층 은 다음 ACTION 까지 후속 Touch 사건 을 더 이상 받 을 수 없습니다.DOWN 사건.설명:a.특정한 등급 에서 특정한 사건 을 처리 하지 않 은 것 은 이 사건 과 그의 하위 View 가 이 사건 을 처리 하지 않 았 다 는 것 을 말한다.b.이 규칙 은 Activity 층 에 적용 되 지 않 습 니 다.모든 Touch 사건 을 받 을 수 있 습 니 다.c.ACTION 을 처리 하지 않 았 다 면MOVE 같은 사건 은 아무런 영향 이 없다.하면,만약,만약...DOWN 사건 은 특정한 View 의 범위 내 에서 발생 하면 후속 적 인 ACTIONMOVE,ACTION_UP 와 ACTIONCANCEL 등 사건 은 모두 이 View 로 발 송 될 것 이 며,설령 사건 이 아웃 되 었 더 라 도.첫 번 째 누 른 손가락 으로 ACTION 발동DOWN 이벤트,이후 누 른 손가락 터치 ACTIONPOINTER_DOWN 이벤트,가운데 일어 난 손가락 터치 ACTIONPOINTER_UP 이벤트,마지막 에 일어 난 손가락 터치 ACTIONUP 이벤트(ACTION 을 촉발 하 는 것 이 아니 더 라 도DOWN 사건 의 그 손가락).pointer id 는 손가락 을 추적 하 는 데 사용 할 수 있 습 니 다.누 른 순간 부터 pointer id 가 유효 합 니 다.일어 나 는 순간 까지 유효 합 니 다.이 사 이 는 변 하지 않 습 니 다.하면,만약,만약...DOWN 사건 이 부모 View 에 의 해 차단 되 었 으 면 어떤 하위 View 가 더 이상 터치 사건 을 받 지 않 을 것 입 니 다(이것 은 첫 번 째 요구 에 부합 합 니 다).하면,만약,만약...DOWN 사건 이 부모 View 에 의 해 차단 되 었 는데,그것 은 지난번 에 ACTION 을 처리 한 것 입 니 다.DOWN 이벤트 의 하위 뷰 는 ACTION 을 받 습 니 다.CANCEL 사건 은 이후 에 더 이상 터치 사건 을 받 지 않 을 것 입 니 다.설령 부모 View 가 후속 터치 사건 을 차단 하지 않 더 라 도.부모 View 가 Touch 사건 을 처리 하기 로 결정 하거나 하위 View 가 Touch 사건 을 처리 하지 않 으 면 부모 View 는 일반 View 의 처리 방식 으로 Touch 사건 을 처리 합 니 다.그렇지 않 으 면 Touch 사건 을 처리 하지 않 습 니 다(배포 만 담당 합 니 다).부모 View 가 onInterceptTouch Event 에서 사건 을 차단 하면 onInterceptTouch Event 에서 Touch 사건 을 받 지 않 고 사건 은 직접 처리 합 니 다(일반 View 의 처리 방식 에 따라).다음은 세부 사항 을 층 별로 나 누 어 이야기 하 겠 습 니 다.1.Activity 층:

public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) { // View
return true;
}
return onTouchEvent(ev); // View ,
}
2.View 층:

public boolean dispatchTouchEvent(MotionEvent event) {
//
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
return true;
}
if (onTouchEvent(event)) {
return true;
}
return false;
}
View 의 onTouch 방법 코드 가 비교적 많 고 주요 논 리 는 두 단계 로 나 뉜 다.먼저 사건 을 Touch Delegate 에 맡 기 고(있 으 면)Touch Delegate 가 처리 하지 않 으 면 스스로 처리한다.자체 처 리 는 주로 View 상태의 변환(예 를 들 어 상 태 를 누 르 는 것),사건 을 길 게 누 르 고 사건 의 검 측 과 트리거 등 을 클릭 합 니 다.3.ViewGroup 층(비교적 복잡):ViewGroup 층 이 Touch 사건 을 처리 하 는 전체적인 논 리 는 차단 이 필요 한 지 먼저 검 측 하고 차단 이 없 으 면 서브 View 처 리 를 보 내 고 서브 View 가 처리 되 지 않 으 면 자체 적 으로 처리 하 며 자체 적 으로 처리 하 는 논 리 는 View 와 같다 는 것 이다.차단 의 논 리 는 다운 에서 up 사이 의 모든 사건 을 하나의 사건 으로 간주 하고 다운 에서 차단 하면 그룹 내의 후속 다른 사건 은 완전히 자신 에 게 맡 기 고 더 이상 차단 논리 에 들 어 갈 필요 가 없다 는 것 이다.중간 차단 이 라면 하위 View 에 cancel 사건 을 보 내 고 팀 내 후속 다른 사건 은 완전히 자신 에 게 맡 기 며 차단 논리 에 들 어 갈 필요 가 없습니다.분배 의 논 리 는,ACTION 에서DOWN 사건 때 하위 뷰 를 찾 아 처리 하 는 것 을 Target 찾기 라 고 합 니 다.Target 을 찾 지 못 하면 스스로 처리 합 니 다.Target 을 찾 으 면 Target 에 맡 깁 니 다.코드 상 dispatchTouchEvent 는 배포 논 리 를 책임 지고 onTouchEvent 는 진정한 처리 논 리 를 책임 집 니 다.보통 onTouchEvent 를 다시 불 러 와 야 합 니 다.특별한 상황 에서 만 dispatchTouchEvent 를 다시 불 러 와 야 합 니 다.

좋은 웹페이지 즐겨찾기