android GestureDetector学习

当用户触摸屏幕的时候,会产生许多手势,例如[color=red]down,up,scroll,filing[/color]等等。
一般情况下,[color=red]我们知道View类有个View.OnTouchListener内部接口[/color],通过重写他的[b]onTouch(View v, MotionEvent event)[/b]方法,我们可以处理一些touch事件,[b]但是这个方法太过简单,如果需要处理一些复杂的手势[/b],用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。

Android sdk给我们提供了[color=red]GestureDetector(Gesture:手势Detector:识别)类[/color],通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的。
[color=red]GestureDetector[/color]这个类对外提供了两个接口:[color=red]OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener。[/color]
GestureDetector.OnDoubleTapListener接口:用来通知DoubleTap事件,类似于鼠标的双击事件。
1.onDoubleTap(MotionEvent e):[color=red]在双击的第二下,Touch down时触发。[/color]
2.onDoubleTapEvent(MotionEvent e):通知DoubleTap手势中的事件,[color=red]包含down、up和move事件[/color](这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知);双击的第二下Touch down和up都会触发,可用e.getAction()区分。
3.onSingleTapConfirmed(MotionEvent e):[color=red]用来判定该次点击是SingleTap而不是DoubleTap[/color],[b]如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap[/b],然后触发SingleTapConfirmed事件。这个方法不同于onSingleTapUp,他是在GestureDetector确信用户在第一次触摸屏幕后,没有紧跟着第二次触摸屏幕,也就是不是“双击”的时候触发
GestureDetector.OnGestureListener接口:用来通知普通的手势事件,该接口有如下六个回调函数:
1.onDown(MotionEvent e):down事件;
2.onSingleTapUp(MotionEvent e):一次点击up事件;在touch down后又没有滑动
(onScroll),又没有长按(onLongPress),然后Touchup时触发。点击一下非常快的(不滑动)Touchup:
[b]onDown->onSingleTapUp->onSingleTapConfirmed [/b]
点击一下稍微慢点的(不滑动)Touchup:
[b]onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed[/b]
[size=medium][color=red]3.onShowPress(MotionEvent e):down事件发生而move或则up还没发生前触发该
事件;[/color][/size]Touch了还没有滑动时触发(与onDown,onLongPress)比较onDown只要Touch down一定立刻触发。而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。所以Touchdown后一直不滑动
按照onDown->onShowPress->onLongPress这个顺序触发。
[color=red]4.onLongPress(MotionEvent e)[/color]:长按事件;Touch了不移动一直Touch down时触发
[size=medium][color=red]5.onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑动手势事件;[/color][/size]
Touch了滑动一点距离后,在ACTION_UP时才会触发
[color=red]参数[/color]:e1 第1个ACTION_DOWN MotionEvent 并且只有一个;e2 最后一个ACTION_MOVE MotionEvent ;velocityX X轴上的移动速度,像素/秒 ;velocityY Y轴上的移动速度,像素/秒.触发条件:X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
[size=medium][color=red]6.onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上拖动事件。[/color][/size]无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法在[color=red]ACTION_MOVE[/color]动作发生时就会触发
抛:手指触动屏幕后,稍微滑动后立即松开
[color=red]onDown----->onScroll---->onScroll---->onScroll---->………----->onFling[/color]
拖动:
[color=red]onDown------>onScroll---->onScroll------>onFiling[/color]

[b]1. 点击屏幕上的某项的执行流程 有两种情况,一种是时间很短,一种时间稍长[/b]
[color=red]时间很短[/color]:onDown--------》onSingleTapUp--------》onSingleTapConfirmed
[color=red]时间稍长[/color]:onDown--------》onShowPress------》onSingleTapUp--------》onSingleTapConfirmed
[b]2. 长按事件[/b]
[color=red]onDown--------》onShowPress------》onLongPress[/color]
[b]3.抛:手指触动屏幕后,稍微滑动后立即松开[/b]
[color=red]onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling[/color]
[b]4.拖动[/b]
[color=red]onDown------》onScroll----》onScroll------》onFiling[/color]
[color=blue]注意:有的时候会触发onFiling,但是有的时候不会触发,个人理解是人的动作不标准所致。[/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值