Android Gesture 的简单认识

android

android

之前在脑残式电视购物里,瞥见一个辣妹拿个某某品牌的手机左摇右晃,此时一个激昂的声音:想换首歌听吗?只要你摇一摇手机就可以啦;要接听电话麻烦吗?只要你晃一晃手机就做到了。 ……

暂且不评电视购物如何雷人、脑残,单就晃动手机进行一些操作,这在此前是比较新潮的,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坐标轴上运动的最低/高移动速度的基准值,后面的逻辑里,手势移动的最低/高速度必须要大于基准值。

Leave a comment

Your comment