美文网首页
关于事件分发的一些新理解

关于事件分发的一些新理解

作者: 最美下雨天 | 来源:发表于2019-12-12 21:48 被阅读0次

1、如果view消耗了down事件,但是没有消耗其余事件,那么其余事件会传递到viewgroup的onTouchEvent吗?
答案是不会,会直接传回到Activity的onTouchEvent
我觉得这个的关键是执行了viewgroup的dispatchTouchEvent方法还是view的dispatchTouchEvent方法,viewgroup覆写了view的dispatchTouchEvent方法,onTouchEvent方法是在view的dispatchTouchEvent方法中调用的

2、mFirstTouchTarget是一个链表,这个链表的个数什么时候是大于1的?
其实大多数情况下,我们当成一个来处理就行了,下面的参考文章中有介绍什么是情况下会大于1

3、如果一个view消耗了down事件,那么在后面的事件触发后,还会不会再去遍历所有的子view,去找是哪个应该消费事件,换句话说,就是说在后面的move事件发生后,要找消耗了down事件的view,还需要去循环遍历吗所有的字view吗?
答案是不需要,会直接去mFirstTouchTarget为首的链表中查找

参考文章:http://www.cnblogs.com/mmmmar/p/8535557.html

布局:

ViewGroup#dispatchTouchEvent
方法中大部分代码都是在down事件的时候才会去考虑执行的,move、up事件是比较简单的

image.png

LinearLayout1#dispatchTouchEvent

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                Log.e("abc","linearlayout1--dispath-->down");
                try {
                    //这儿循环是为了能获取到viewgroup中mFirstTouchTarget的值
                    Class cls=this.getClass();
                    while(cls.getSuperclass()!= ViewGroup.class)
                    {
                        cls=cls.getSuperclass();
                    }
                    Field field=cls.getSuperclass().getDeclaredField("mFirstTouchTarget");
                    field.setAccessible(true);
                    Log.e("abc","linearlayout1--dispath-->down"+field.get(this));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            case MotionEvent.ACTION_MOVE:
                Log.e("abc","linearlayout1--dispath-->move");
                try {
                    //这儿循环是为了能获取到viewgroup中mFirstTouchTarget的值
                    Class cls=this.getClass();
                    while(cls.getSuperclass()!= ViewGroup.class)
                    {
                        cls=cls.getSuperclass();
                    }
                    Field field=cls.getSuperclass().getDeclaredField("mFirstTouchTarget");
                    field.setAccessible(true);
                    Log.e("abc","linearlayout1--dispath-->move"+field.get(this));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            case MotionEvent.ACTION_UP:
                Log.e("abc","linearlayout1--dispath-->up");
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
子view处理了down事件

LinearLayout2#dispatchTouchEvent

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                Log.e("abc","linearlayout2--dispath-->down");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.e("abc","linearlayout2--dispath-->move");
                try {
                    //这儿循环是为了能获取到viewgroup中mFirstTouchTarget的值
                    Class cls=this.getClass();
                    while(cls.getSuperclass()!= ViewGroup.class)
                    {
                        cls=cls.getSuperclass();
                    }
                    Field field=cls.getSuperclass().getDeclaredField("mFirstTouchTarget");
                    field.setAccessible(true);
                    Log.e("abc","linearlayout2--dispath-->move"+field.get(this));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            case MotionEvent.ACTION_UP:
                Log.e("abc","linearlayout2--dispath-->up");
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
子view处理了down事件

相关文章

网友评论

      本文标题:关于事件分发的一些新理解

      本文链接:https://www.haomeiwen.com/subject/vobiiqtx.html