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事件拦截,结论党福音)