android onTouchEvent 처리 메커니즘 요약(필수)

8679 단어 androidontouchevent
프로젝트 에 서 는 터치 사건 을 사용 하 는데 매번 바 이 두 의 각종 자 료 를 사용 하고 각종 대신 들 의 분석 노트 를 본다.이번에 나 는 터치 사건 에 관 한 지식 을 스스로 정리 했다.첫째,터치 사건 에 대한 인상 을 더욱 깊 게 하고 앞으로 의 프로젝트 에 참고 할 수 있다.가장 이해 하기 어 려 운 것 은 온 터치 이벤트 방법 이다.
개술
1.view,ViewGroup,Activity 만 이벤트 배포 와 소비 기능 을 가진다.
2.액 티 비 티 는 위 에서 터치 이벤트 에 가장 먼저 접 촉 했 기 때문에 액 티 비 티 는 이벤트 차단 방법 이 없다.dispatchTouchEvent 방법 이 없다 는 것 이다.
3.하위 컨트롤 을 추가 할 수 없 는 view 에 대해 서 는 이 벤트 를 배포 하고 차단 할 수 없습니다.onTouchEvent 이벤트 만 있 습 니 다.
두 세 가지 방법
1.public boolean dispatchTouchEvent(MotionEvent ev)
터치 이벤트 가 발생 할 때 먼저 현재 activity 에 의 해 배 포 됩 니 다.즉,현재 activity 의 dispatchTouchEvent 방법 이 실 행 됩 니 다.
이때 이 방법 은 세 가지 반환 상황 이 있다.
return false:사건 이 배포 되 지 않 음 을 나타 낸다.사건 은 거품 을 일 으 키 는 방식 으로 상부 의 view 나 activity 에 전달 되 는 onTouchEvent 방법 으로 소 비 됩 니 다.
return true:이 시간 이 처리 되 었 음 을 나타 낸다.이 벤트 는 현재 view 나 activity 의 dispatchTouchEvent 에 의 해 소 비 됩 니 다.더 이상 전달 하지 않 겠 습 니 다.사건 은 여기 서 끝 납 니 다.
return 슈퍼.dispatchTouchEvent(ev):이 사건 이 배 포 될 것 임 을 나타 낸다.현재 View 의 onIntercepterTouchEvent 방법 은 이 사건 을 포착 하여 이벤트 의 차단 이 필요 한 지 판단 합 니 다.
2.public boolean onInterceptTouchEvent(MotionEvent ev)    
이 방법 은 사용자 가 전 달 된 사건 을 차단 하여 전 달 된 사건 이 현재 view 에 의 해 처리 되 어야 하 는 지 판단 하 는 데 사 용 됩 니 다.
return false:사건 을 차단 하지 않 고 이 사건 을 통과 시 킵 니 다.이 벤트 는 현재 view 의 하위 컨트롤 에 전 달 됩 니 다.하위 컨트롤 의 dispatchTouchEvent 방법 으로 배포 처 리 됩 니 다.
return true:이 사건 을 차단 하고 현재 view 의 onTouchEvent 방법 에 맡 깁 니 다.
return 슈퍼.inInterceptTouchEvent(ev):기본 차단 방식 은 return true 와 같 습 니 다.이 사건 은 차단 되 어 현재 view 의 onTouchEvent 방법 으로 처리 합 니 다.(여기 에는 두 개의 view 가 있 을 때 약간의 설명 이 필요 하 다.A view 에 B view 가 있 습 니 다.A.A 를 누 르 면 onInterceptTouchEvent()가 슈퍼.interceptTouchEvent(ev)로 돌아 가면 이 벤트 는 A 에 의 해 차단 되 고 A 의 onTouchEvent()에 맡 겨 집 니 다.B 를 누 르 면 A 에서 onInterceptTouchEvent()가 슈퍼.interceptTouchEvent(ev)로 돌아 가면 이 벤트 는 차단 되 지 않 고 하위 컨트롤 에 배 포 됩 니 다) 
3.public boolean onTouchEvent(MotionEvent event)
현재 view 에서 이 벤트 를 차단 하면 이벤트 가 이 방법 으로 전 달 됩 니 다.
return false:이 사건 을 소비 하지 않 았 음 을 나타 내 며,사건 은 거품 을 일 으 키 는 방식 으로 상부 의 view 나 Activity 의 onTouchEvent 사건 으로 처 리 됩 니 다.최상 위 view 나 Activity 의 onTouch Event 가 false 로 돌아간다 면.이 사건 은 사라 질 것 이다.다음 일련의 사건 들 은 상부 의 onTouch Event 방법 에 의 해 직접 포 획 될 것 이다.
return true:이 사건 을 소 비 했 음 을 나타 내 고 사건 은 여기 서 끝 납 니 다.
return 슈퍼.onTouchEvent(event):기본 상황 은 return false 와 같 습 니 다.
인증:
MainActivity FatherView ChildView 에서 몇 가지 방법 을 모두 슈퍼 로 되 돌려 줍 니 다.***터치 이벤트(ev)
분석:
1.화면 을 클릭 하면.MainActivity 의 dispatchTouchEvent 방법 을 먼저 실행 하고 MainActivity-dispatchTouchEvent->ACTION 인쇄DOWN
2.super.dispatchTouchEvent(ev)를 되 돌려 주기 때문에 이벤트 ev 는 배포 되 지만,MainActivity 에는 onInterceptTouchEvent()방법 이 없 기 때문에 이벤트 가 FatherView 의 dispatchTouchEvent 방법 으로 전 달 됩 니 다.FatherView-dispatchTouchEvent->ACTION 인쇄DOWN
3.FatherView 에서 dispatchTouchEvent 는 슈퍼.dispatchTouchEvent(ev)로 되 돌아 가 모든 이벤트 가 배 포 됩 니 다.FatherView 의 onInterceptTouchEven()에서 의 방법 이 실 행 됩 니 다.FatherView-onInterceptTouchEven 인쇄-->ACTIONDOWN
4.FatherView 의 onInterceptTouchEven()은 슈퍼.on InterceptTouchEvent(ev)를 되 돌려 줍 니 다.여기 서(1)화면 에 있 는 ChildView 를 클릭 하면.이 벤트 는 차단 되 지 않 고 ChildView 의 dispatchTouchEvent 방법 으로 전 달 됩 니 다.(2)클릭 한 값 FatherView 는 이벤트 가 차 단 됩 니 다.FatherView 의 onTouchEvent()방법 이 실 행 됩 니 다.(1)의 경우 ChildView-dispatchTouchEvent->ACTION 을 인쇄 합 니 다.DOWN。
5.ChildView 에서 dispatchTouchEvent 는 슈퍼.dispatchTouchEvent(ev)를 되 돌려 주 고 모든 사건 이 배 포 됩 니 다.인쇄 ChildView-onInterceptTouchEvent->ACTIONDOWN。
6.이때 ChildView 에서 onInterceptTouchEvent 는 슈퍼.on InterceptTouchEvent(ev)로 되 돌아 가 고 하위 컨트롤 이 없어 서 사건 이 차단 된다.ChildView-onTouchEvent->ACTION 인쇄DOWN。
7.childView 에서 onTouchEvent()반환 액 은 슈퍼.onTouchEvent(ev)입 니 다.이 벤트 는 소모 되 지 않 고 거품 을 일 으 키 는 방식 으로 상층 공간의 onTouchEvent()에 전 달 됩 니 다.이 상층 공간의 onTouchEvent 는 슈퍼.onTouchEvent(ev)로 되 돌아 갑 니 다.그 러 니까 Father-onTouch Event->ACTIONDOWN。 MainActivty-onTouchEvent-->ACTION_DOWN。
8.이후 의 이벤트 동작 은 MainActivity 에 의 해 하위 view 에 배포 되 지 않 고 MainActivty 의 onTouch Event 처리 에 소 모 됩 니 다.인쇄 MainActivity-dispatchTouchEvent->ACTIONUP,MainActivty-onTouchEvent-->ACTION_UP

MainActivity-dispatchTouchEvent-->ACTION_DOWN
FatherView-dispatchTouchEvent-->ACTION_DOWN
FatherView-onInterceptTouchEven-->ACTION_DOWN
ChildView-dispatchTouchEvent-->ACTION_DOWN
ChildView-onInterceptTouchEvent-->ACTION_DOWN。
ChildView-onTouchEvent-->ACTION_DOWN
Father-onTouchEvent-->ACTION_DOWN。 
MainActivty-onTouchEvent-->ACTION_DOWN
MainActivity-dispatchTouchEvent-->ACTION_UP,
MainActivty-onTouchEvent-->ACTION_UP
코드
MainActivity.java

public class MainActivity extends Activity {
 
  private static final String TAG = "MainActivity";
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
   super.onCreate( savedInstanceState);
   setContentView(R.layout. activity_main);
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event) {
   // TODO Auto-generated method stub
   Log. i(TAG, "activity-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));
   return super.onTouchEvent( event);
  }
 
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
   Log. i(TAG, "activity-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.dispatchTouchEvent( ev);
  }
FatherView.java

public class FatherView extends LinearLayout {
  private static final String TAG = "MainActivity";
 
  public FatherView(Context context) {
   super( context);
 
  }
 
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Father-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.dispatchTouchEvent( ev);
  }
 
  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Father-onInterceptTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.onInterceptTouchEvent( ev);
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event ) {
   Log. i(TAG, "Father-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));
   return super.onTouchEvent( event);
  }
 
}
ChildView.java

public class ChildView extends LinearLayout {
 
  private static final String TAG = "MainActivity";
 
  public ChildView(Context context) {
   super( context);
  }
 
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Child-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.dispatchTouchEvent( ev);
  }
 
  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Child-onInterceptTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.onInterceptTouchEvent( ev);
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event ) {
   Log. i(TAG, "Child-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));
   return super.onTouchEvent( event);
  }
 
}
 
activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width= "match_parent"
 android:layout_height= "match_parent"
 tools:context="${relativePackage}.${activityClass}" >
 
 <com.ethanlbb.toucheventtest.FatherView
  android:layout_width= "match_parent"
  android:layout_height= "match_parent"
  android:background= "@android:color/holo_blue_dark"
  android:gravity= "center" >
 
  <com.ethanlbb.toucheventtest.ChildView
   android:layout_width= "200dp"
   android:layout_height= "200dp"
   android:layout_gravity= "center"
   android:background= "#0000ff" >
  </com.ethanlbb.toucheventtest.ChildView >
 </com.ethanlbb.toucheventtest.FatherView >
 
</RelativeLayout>
이상 의 안 드 로 이 드 onTouchEvent 처리 체 제 는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 여러분 들 이 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기