一次完整的事件傳遞主要包括三個階段:事件的分發、攔截、消費。
1.分發(Dispatch):事件的分發對應着dispatchTouchEvent方法
public boolean dispatchTouchEvent(MotionEvent event)
2.攔截(Intercept):事件的攔截對應着onInterceptTouchEvent方法,這個方法只在ViewGroup及其子類中才存在,在View和Activity中是不存在的
3.消費(Consume):事件的消費對應着onThouchEvent方法
public boolean onTouchEvent(MotionEvent event)
在Android系統中,擁有事件傳遞處理能力的類有以下三種,
1.Activity:擁有dispatchThouchEvent和onThouchEvent兩個方法
2.ViewGroup: 擁有dispatchThouchEvent、onInterceptTouchEvent和onThouchEvent三個方法
3.View:擁有dispatchThouchEvent和onThouchEvent兩個方法。
來個事例代碼:
public class MyTextView extends AppCompatTextView {
private String TAG = "MyTextView";
public MyTextView(Context context) {
super(context);
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e(TAG,"dispatchTouchEvent_ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.e(TAG,"dispatchTouchEvent_ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e(TAG,"dispatchTouchEvent_ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(TAG,"dispatchTouchEvent_ACTION_CANCEL");
break;
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e(TAG,"onTouchEvent_ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.e(TAG,"onTouchEvent_ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e(TAG,"onTouchEvent_ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(TAG,"onTouchEvent_ACTION_CANCEL");
break;
}
return super.onTouchEvent(event);
}
}
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyTextView viewById = (MyTextView) findViewById(R.id.mytextView);
viewById.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(TAG, "MyTextView_Onclick");
}
});
viewById.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e(TAG, "MyTextView_onTouch_ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.e(TAG, "MyTextView_onTouch_ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e(TAG, "MyTextView_onTouch_ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(TAG, "MyTextView_onTouch_ACTION_CANCEL");
break;
}
return false;
}
});
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e(TAG, "dispatchTouchEvent_ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.e(TAG, "dispatchTouchEvent_ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e(TAG, "dispatchTouchEvent_ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(TAG, "dispatchTouchEvent_ACTION_CANCEL");
break;
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e(TAG, "onTouchEvent_ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.e(TAG, "onTouchEvent_ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e(TAG, "onTouchEvent_ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(TAG, "onTouchEvent_ACTION_CANCEL");
break;
}
return super.onTouchEvent(event);
}
}
點擊控件打印如下:
看到打印的日誌得到如下圖