Android事件分发(二)

本文详细解析了Android中ViewGroup的事件分发机制,包括事件如何从ViewGroup传递到View,以及ViewGroup如何通过onInterceptTouchEvent方法拦截事件。同时,文章还深入探讨了dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个关键方法的作用与逻辑。

上篇文章主要讲了View的事件分发,这篇文章将带大家一起继续分析Android的事件分发。

 

一、我们先来看一下ViewGroup的事件分发。

首先来了解一下ViewGroup,ViewGroup继承于View,它的已知直接子类有DrawerLayout、FrameLayout、GridLayout、LinearLayout、RelativeLayout、RecycleView、ViewPager等等。

可以看到,我们平常项目中使用到的很多布局都属于ViewGroup的子类。

好了,言归正传。我们来看ViewGroup的事件分发:

1、Android事件分发是先传递到ViewGroup,再由ViewGroup传递到View的。

2、在ViewGroup中可以通过onInterceptTouchEvent方法对事件进行拦截,如果返回true,则事件将不会传递到子View,如果返回false,则事件将继续传递到子View中,默认返回false。

3、子View中如果将传递的事件消费掉,那么ViewGroup中将无法接受到任何事件。

 

 

二、下面具体对事件分发与处理所涉及的这三个方法dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev)进行整理总结。

 

1、boolean dispatchTouchEvent(MotionEvent ev)  事件分发

Touch事件发生时,Actiivty的dispatchTouchEvent方法会以隧道方式将事件传递到最外层的View的dispatchTouchEvent方法,并且通过该View的dispatchTouchEvent方法进行分发。

事件分发逻辑如下:

return true,事件会分发给当前View并且由dispatchTouchEvent方法进行消费,同时事件会停止向下消费。

return false,事件分发分为两种情况:

如果当前View获取的事件直接来自Activity,则会将事件返回给Activity的onTouchEvent进行消费

如果当前View获取的事件来自外层父控件,则会将事件返回给父控件的onTouchEvent进行消费

return super.dispatchTouchEvent(ev),事件会自动地分发给当前View的onInterceptTouchEvent方法

 

2、boolean onInterceptTouchEvent(MotionEvent ev)  事件拦截

事件拦截逻辑如下:

return true,则表示将事件拦截,并且将拦截到的事件交由当前View的onTouchEvent进行处理

return false,则表示将事件放行,当前View上的事件会被传递到子View上,再由子View的dispatchTouchEvent来开始这个事件的分发

return super.onInterceptTouchEvent(ev),事件默认会被拦截,并且将拦截到的事件交由当前View的onTouchEvent进行处理

 

3、boolean onTouchEvent(MotionEvent ev)  事件响应

事件响应逻辑如下:

return false,那么这个事件会从当前View向上传递,并且都是由上层View的onTouchEvent来接收

return true,则会接收并且消费该事件

return super.onTouchEvent(ev),默认处理事件的逻辑与return false时相同

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值