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 처리 체 제 는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 여러분 들 이 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.