android事件拦截|android事件拦截,结论党福音

之前看过太多的书和网上的博客,对于事件拦截一直云里雾里,原理学了不少就是不会用.
网上的资料太理论化了,我这种新手没法理解...
于是最近花了一整天学习了下,最后发现也不过如此....
实际上搞清楚事件拦截的问题只要搞明白两个方法就行了

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事件拦截,结论党福音】我觉得如果搞明白这四个问题了,我想事件拦截的绝大多数问题应该就能轻易解决了!
希望能够帮到你!~

    推荐阅读