Android Gesture 的简单认识
之前在脑残式电视购物里,瞥见一个辣妹拿个某某品牌的手机左摇右晃,此时一个激昂的声音:想换首歌听吗?只要你摇一摇手机就可以啦;要接听电话麻烦吗?只要你晃一晃手机就做到了。 ……
暂且不评电视购物如何雷人、脑残,单就晃动手机进行一些操作,这在此前是比较新潮的,Android SDK 在这方面提供了手势动作识别接口,应用开发者可以使用它做一些比较炫的功能。
如果想实现 Android SDK 提供的所有手势,则需要实现 GestureDetector.OnGestureListener 接口和 GestureDetector.OnDobuleTapListener。
如果只是想要监听一部分手势动作,则继承 GestureDetector.SimpleOnGestureListener 是一种更简单的做法。GestureDetector.SimpleOnGestureListener 实现了 GestureDetector.OnGestureListener 和GestureDetector.onDoubleTapListener 的所有方法。
题外话,如果你有足够的好奇心,查看 GestureDetector.SimpleOnGestureListener 的源代码,可以看到其实现是“空空如也”,所有的方法体都是没有任何code,除了需要返回值(boolean 值)的,一律返回false外。这可能就是它为什么叫做Simple的原因吧,真是够Simple的。
言归正传,Android 提供的谷歌拼音输入法是学习 Android 应用开发的好例子,其中 PinyinIME.java 实现了一个inner class(内部类)– PinyinIME.OnGestureListener,通过此类可以了解到如何实现 scroll 操作,通俗地讲就是划屏,按下手指快速移动。
在 PinyinIME.OnGestureListener 中,首先定义了六个常量,如下所示:
/** * When user presses and drags, the minimum x-distance to make a * response to the drag event. */ private static final int MIN_X_FOR_DRAG = 60; /** * When user presses and drags, the minimum y-distance to make a * response to the drag event. */ private static final int MIN_Y_FOR_DRAG = 40; /** * Velocity threshold for a screen-move gesture. If the minimum * x-velocity is less than it, no gesture. */ static private final float VELOCITY_THRESHOLD_X1 = 0.3f; /** * Velocity threshold for a screen-move gesture. If the maximum * x-velocity is less than it, no gesture. */ static private final float VELOCITY_THRESHOLD_X2 = 0.7f; /** * Velocity threshold for a screen-move gesture. If the minimum * y-velocity is less than it, no gesture. */ static private final float VELOCITY_THRESHOLD_Y1 = 0.2f; /** * Velocity threshold for a screen-move gesture. If the maximum * y-velocity is less than it, no gesture. */ static private final float VELOCITY_THRESHOLD_Y2 = 0.45f; |
这六个变量定义了判断手势的基本条件,手势运动会有位移,分为X坐标轴位移和Y坐标位移,– 注意这里暂且不区分物理学上的位移和距离,MIN_X_FOR_DRAG 和 MIN_Y_FOR_DRAG 就是判断 X/Y 坐标轴位移是否足够远,在后面的逻辑里,如果大于上述二值之一或全部,则视为具备了手势的基本条件。
在手势运动过程中,单单有位移数据是不够的,它需要足够的快,但又不能足够的快,因为定义了X/Y坐标轴上运动的最低/高移动速度的基准值,后面的逻辑里,手势移动的最低/高速度必须要大于基准值。