android下的事件分发

    android中的事件分发是从activity的dispatchTouchEvent()方法开始的,在activity的这个方法中实际上调用的是这个布局也就是ViewGroup的dispatchTouchEvent方法.所以虽然viewgroup是view的子类,但是事件分发还是从viewGroup开始,一级一级的传递给它的所有子类,子类不能响应在返回给父类处理

接下来我就分别说说viewgroup和view的事件分发,首先讲讲viewgroup的事件分发.
1.把布局坐标转换为视图坐标(滚动后的坐标,不只是屏幕的区域)
2.将mMotionTarget设置为null
3.不可以拦截viewgroup的touch事件,这样子view才能响应到事件(listview会拦截move事件,如果listview中viewpager那么移动时,会首先被listview拦截),拦截只是让它响应不了事件,如果是viewgroup,那么即使它被拦截了不能响应事件,但是它的子view还是可以响应事件的,事件还是会传递给它的子view的,要解决listview的问题就只要让listview的父类拦截了listview,那么事件就会直接传递给viewpager,其实就是重写listview父类的dispatchTouchEvent方法,在这个方法中直接调用viewpager的dispatchTouchEvent方法,而不在调用父类的dispatchTouchEvent方法,也就不会将事件分发给listview了.
4.当event为ACTION_DOWN时,获取到所有的孩子,倒着遍历,首先判断view是否是可见的,如果是在根据当前手指的坐标判断有没有落在在view身上.如果是就在判断是view还是viewGroup,如果是view就响应view的事件分发.如果是viewGorop在递归遍历.如果该view能响应事件(看view的dispatchTouchEvent方法是否返回true,返回true表示可以响应)那么就将view赋值给mMotionTarget,同时返回true,表示有view可以响应dwon事件.
5.,当action==ACTION_UP或者ACTION_CANCEL时
来判断mMotionTarget是否为null,如果为null,表示在事件为ACTION_DOWN时没有子view可以响应事件,就调用父类的dispatchTouchEvent()方法,将事件返回给父类去处理..如果不null就表示有view可以响应事件,也就会执行ACTION_UP的逻辑

    再说说View的事件分发

View.dispatchTouchEvent->View.setOnTouchListener->View.onTouchEvent(包括点击事件)
首先会调用View的dispatchTouchEvent方法, 在dispatchTouchEvent中会进行OnTouchListener的判断,如果OnTouchListener不为null且返回true(就是在View设置了onTouchListener且OnTouch的返回值为true),则表示事件被消费,onTouchEvent不会被执行;否则会执行onTouchEvent,如果设置了onclicklistener那么无论如何onTouchEvent方法都是返回的都是true。
View可以同时设置OnClikeListener和OnLongClickeListener但是,是先执行的长按的事件,所以如果要想短按的可以执行,长按的return必须是false.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值