为了检测更加多样化的手势,android提供了GestureDetector类来简化该检测识别过程。 通过GestureDetector可以方便的识别单击、双击、长按、fling等事件,从而加快开发效率同时提升应用的交互体验。
1、GestureDetector基本用法
首先构造GestureDetector对象。 GestureDetector有如下构造方法
图一 GestureDetector构造方法一
图二 GestureDetector构造方法二
图三 SimpleOnGestureListener
SimpleOnGestureListener是一个类,实现了OnGestureListener、OnDoubleTapListener、OnContextClickListener三个接口。相当于将三个接口汇集成一个,在传入到GestureDetector构造方法中时,构造方法中会判断类型,并设置到相应的对象(如图二红框代码处)。
在日常开发中,为了代码简洁,一般会传入SimpleOnGestureListener来构造GestureDetector对象。 与此同时,在SimpleOnGestureListener类中覆写关心的事件接口,并处理相应的手势事件。
然后在view的onTouchEvent中调用GestureDetector.onTouchEvent(event)即可(即将touchevent给到GestureDetector来处理),代码如下:
图四 GestureDetector接管touchevent
至此,GestureDetector就可以识别出相应的手势,并且回调对应的接口了。
2、事件接口不回调问题
在某次使用GestureDetector时,随手写下了如下两种形式的代码
图五 GestureDetector接管touchevent二
图六 GestureDetector接管touchevent三
结果相应的事件无法回调。这是为啥呢?
后来在网上查了一下,看了一篇博主的文章,提示要使用图四的方法,直接返回true。于是,我突然明白了,是因为GestureDetector.onTouchEvent(参见图三红框处代码)与super.onTouchEvent对于down事件都是返回的false,故后续的事件便不会再下发。
参考本篇博客,(关于android事件分发中mFirstTouchTarget的理解 - 掘金 (juejin.cn))。
于是,为了让事件接口正常回调,可以按图四的方式编写,也可以按图五、图六的写,但是此种写法时,要将事件接口中的onDown方法返回true,标识后续的事件也分发到该view并且由其处理。
图七 onDown的处理
3、总结
当各种手势事件没按照预期走的时候,思考一下是不是各种返回值导致了事件的分发流程改变。 同时,结合事件分发源码分析事件的流向,加深印象。