此种情况下,事件流的ACTION_DOWN先到达View的onTouchEvent,发现它不消耗事件,继而返回上级的ViewGroup的onTouchEvent中,发现它要消耗事件,事件流的后续部分就不在传递给View,也不在调用ViewGroup的onInterceptTouchEvent方法,因为已经知道View不处理事件,所以没必要再通过onInterceptTouchEvent方法来判断了。
示例四、如果在ViewGroup的onInterceptTouchEvent中返回了true拦截了事件,整个事件将不再传递给View而是直接交由ViewGroup的onTouchEvent处理。修改EventDispatchLinearLayout的onInterceptTouchEvent(),让其返回true。
@Override public boolean onInterceptTouchEvent(MotionEvent event) { Log.i(TAG, "onInterceptTouchEvent: " + event.getAction() + " | 是否拦截:" + true); return true;//super.onInterceptTouchEvent(event); }测试log如下:
01-05 19:03:21.788 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件 01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件 01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:true 01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 0 | 是否消耗事件:true 01-05 19:03:21.819 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件 01-05 19:03:21.819 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件 01-05 19:03:21.819 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 2 | 是否消耗事件:true 01-05 19:03:21.877 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件 01-05 19:03:21.877 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件 01-05 19:03:21.877 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 1 | 是否消耗事件:true 示例五、给View绑定OnTouchListener和OnClickListener监听器。在EventDispatchActivity的onCreate()方法里面添加如下代码,并将EventDispatchLinearLayout和EventDispatchTestView的各方法的返回值都还原成示例一中的状态。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event_dispatch); edtv_test = ViewUtils.find(this, R.id.edtv_test); edll_test = ViewUtils.find(this, R.id.edll_test); edtv_test.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 为了log显示的层次更加清晰,这里的TAG使用View的TAG Log.i("————View", "onTouch: 返回 " + false); return false; } }); edtv_test.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 为了log显示的层次更加清晰,这里的TAG使用View的TAG Log.i("————View", "onClick: "); } }); }测试log如下:
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件 01-06 19:35:07.563 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件 01-06 19:35:07.563 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false 01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件 01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false 01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:true 01-06 19:35:07.573 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件 01-06 19:35:07.573 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件 01-06 19:35:07.573 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 2 | 是否拦截:false 01-06 19:35:07.573 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 2 | 分发事件 01-06 19:35:07.574 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false 01-06 19:35:07.574 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 2 | 是否消耗事件:true 01-06 19:35:07.673 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件 01-06 19:35:07.674 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件 01-06 19:35:07.674 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 1 | 是否拦截:false 01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 1 | 分发事件 01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false 01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 1 | 是否消耗事件:true 01-06 19:35:07.704 6737-6737/cn.codingblock.view I/————View: onClick: