之前看过太多的书和网上的博客,对于事件拦截一直云里雾里,原理学了不少就是不会用.
网上的资料太理论化了,我这种新手没法理解...
于是最近花了一整天学习了下,最后发现也不过如此....
实际上搞清楚事件拦截的问题只要搞明白两个方法就行了
public boolean onInterceptTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent event);
本着好记性不如烂笔头的想法,我决定把结果记录下来! 其实事件拦截搞清楚四个问题就解决了!
首先做两个定义,再看下面的文章(我自己给的定义,方便理解)
一系列的点击事件:第一个是 MotionEvent.ACTION_DOWN 和 中间若干个MotionEvent.ACTION_MOVE 和 最后一个MotionEvent.ACTION_UP.
//-----------------------------------------------------------------------------------------------------------
(注意是许多个MotionEvent,而且是有顺序的)
单次点击事件:一个MotionEvent.ACTION_DOWN,或者一个MotionEvent.ACTION_MOVE或者一个MotionEvent.ACTION_UP
//-----------------------------------------------------------------------------------------------------------
(注意是一个MotionEvent)
搞清楚这个很重要
还有一个需要搞明白的是:每次MotionEvent.ACTION_DOWN触发时会重置所有flag (你可以理解每 >>一系列的点击事件<< 都是孤立的,互不相干的)
1.onIntercaptTouchEvent()方法返回值的意义:
返回true:
此次的 >>单次点击事件<< 会直接传递给本View的OnTouchEvent()方法,不传递给子View
且此 >>一系列点击事件<< 的后续不会再传递给子View,
且本view的onInterceptTouchEvent()在 >>一系列点击事件<< 的后续中不会再被调用.
(也就是传说中的拦截事件了!)
返回false:
此次 >>单次事件<< 会传递给子View处理
(传说中的不拦截事件,传递给子View处理)
2.onIntercaptTouchEvent()方法什么时候会被调用?
有两种情况:
1.MotionEvent.ACTION_DOWN
父View的onIntercaptTouchEvent()方法返回false
(MotionEvent.ACTION_DOWN 一般是一系列点击事件的开端)
2.MotionEvent.ACTION_MOVE或者MotionEvent.ACTION_UP
父View的onInterceptTouchEvent()方法返回false
&& 且上次 >>单次点击事件<< 传递到子View,
&& 且上次 >>单次点击事件<< 子View的onTouchEvent()方法返回了true(也就是说子View消费了事件)
//-------------------------------------------------------------------------
在以上条件都满足的情况下,
>>单次点击事件<< 都会调用onInterceptTouchEvent()方法,
(也就是说每一个 >>单次点击事件<< 发生都会调用一次onInterceptTouchEvent()方法)
3.onTouchEvent()方法返回值的意义:
返回true:
在其他条件不变的情况下----->下一次的 >>单次点击事件<< 还会传递到本View,并调用onTouchEvent()方法;
(也就是说消费了此 >>单次点击事件<< )
返回false:
则 >>一系列点击事件<< 的后续事件不会再传递到此View
(放弃处理此 >>一系列点击事件<<,交由父View处理)
4.onTouchEvent()方法什么时候会被调用?
有三种情况onTouchEvent()方法会被调用
1.本View的onIntercaptTouchEvent()方法返回true
2.子View的onTouchEvent()方法返回false
3.上一次调用本View的onTouchEvent时返回true
【android事件拦截|android事件拦截,结论党福音】我觉得如果搞明白这四个问题了,我想事件拦截的绝大多数问题应该就能轻易解决了!
希望能够帮到你!~