一次完整的事件传递主要包括三个阶段:事件的分发、拦截、消费。
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);
}
}
点击控件打印如下:
看到打印的日志得到如下图