首页 > 代码库 > 手势事件

手势事件

1.基本的手势事件
主要有如下三个方法:
dispatchTouchEvent : 判断该事件是否需要下发。返回true表示需要下发给下级视图,返回false表示不需要下发(交给自身的onTouchEvent处理)。但是否最终下发,还需根据onInterceptTouchEvent的拦截结果。
onInterceptTouchEvent : 判断当前容器是否需要拦截该事件。返回true表示予以拦截(交给自身的onTouchEvent处理)、不放给下级视图,返回false表示不拦截该事件。
onTouchEvent : 判断该事件是否处理完毕。返回true表示处理完毕,则无需处理上级视图的onTouchEvent,一路返回结束流程。返回false表示该事件未完成,则返回继续处理上级视图的onTouchEvent,然后再根据上级onTouchEvent的返回值判断是直接结束还是由再上级处理。

2.手势方法的执行者

页面类:包括Activity及Activity的派生类。页面类可操作dispatchTouchEvent和onTouchEvent。注意Fragment不能操作基本手势方法,只能通过实现OnTouchListener接口来响应手势事件。
控件类:包括从View类派生出的各类控件,包括TextView、ImageView、Button等及它们的派生类。控件类可操作dispatchTouchEvent和onTouchEvent。
容器类:包括从ViewGroup类派生出的各类容器,如三个布局LinearLayout、RelativeLayout、FrameLayout,以及AdapterView派生出来的GridView、ListView、Spinner,还有ViewPager、ViewFlipper等等。容器类可操作dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。
上面可以看出,只有容器类才能操作onInterceptTouchEvent方法,这是因为该方法用于拦截发往下层视图的事件,而控件类已经位于底层只有被拦截的份没有拦截别人的份,同样页面类本身并不拥有下层视图。

3.手势事件的生命周期

控件响应
Activity.dispatchTouchEvent(返回true)->ViewGroup.dispatchTouchEvent(返回true)->ViewGroup.onInterceptTouchEvent(返回false)->View.dispatchTouchEvent(返回true)->View.onTouchEvent(返回true)->结束

容器响应
方式一:Activity.dispatchTouchEvent(返回true)->ViewGroup.dispatchTouchEvent(返回false)->ViewGroup.onTouchEvent(返回true)->结束
方式二:Activity.dispatchTouchEvent(返回true)->ViewGroup.dispatchTouchEvent(返回true)->ViewGroup.onInterceptTouchEvent(返回true)->ViewGroup.onTouchEvent(返回true)->结束
方式三:Activity.dispatchTouchEvent(返回true)->ViewGroup.dispatchTouchEvent(返回true)->ViewGroup.onInterceptTouchEvent(返回false)->View.dispatchTouchEvent(返回true或false)->View.onTouchEvent(返回false)->ViewGroup.onTouchEvent(返回true)->结束

Activity响应
Activity.dispatchTouchEvent(返回false)->Activity.onTouchEvent(返回true)->结束

更详细的生命周期见下图所示:

技术分享

4.TouchEvent

下面是触摸事件的常用方法:
getAction : 获取当前的动作
getX : 获取当前在控件内部的相对坐标X
getY : 获取当前在控件内部的相对坐标Y
getRawX : 获取当前在屏幕上的相对坐标X
getRawY : 获取当前在屏幕上的相对坐标Y
getEventTime : 获取当前的事件时间

 

手势事件