谷歌眼镜GDK开发指南之触控手势

本文介绍了如何在谷歌眼镜上利用GDK进行触控手势的开发,包括通过Android SDK访问触控板原始数据,以及使用GestureDetector识别触摸、滑动和滚动等通用手势。此外,详细讲解了在activity层级和view层级如何处理D-pad keys事件及自定义复杂手势的监听方法。
摘要由CSDN通过智能技术生成

原文地址:http://bbs.seacat.cn/thread-900-1-1.html


可以通过Android sdk访问Glass触控板的原始数据。但GDK提供一个 gesture detector ,可以自动识别通用手势,包括触摸、滑动和滚动。


通过D-pad keys识别手势


默认情况下,Glass系统会将简单的手势转换为D-pad keys事件。可以监听onKeyDown() 和 onKeyUp() 事件来处理D-pad keys:




1、触摸事件转义为 KEYCODE_DPAD_CENTER
2、相机按钮按下事件转义为 KEYCODE_CAMERA.
3、下滑事件转移为 KEYCODE_BACK


这是一小段触控事件的代码:


public class MyActivity extends Activity {
    ...
    @Override
    public boolean onKeyDown(int keycode, KeyEvent event) {
        if (keycode == KeyEvent.KEYCODE_DPAD_CENTER) {
            // user tapped touchpad, do something
            return true;
        }
        ...
        return false;
    }
}



通过gesture detector识别


使用gesture detector可以识别更多复杂的手势,例如多点触控或滚动。复杂的手势没有对应的D-pad key。


你可以实现 GestureDetector 提供的监听接口来通知 Gesture


识别activity层级的手势


1、创建一个 GestureDetector 的监听来处理识别的手势
2、重写activity的 onGenericMotionEvent() 方法,传入motion events给gesture detector的onMotionEvent()方法




当一个motion时间发生时,系统将它传给gesture detector。如果被识别了,gesture detector通知相关的监听接口来处理事件。


public class MainActivity extends Activity {
    private GestureDetector mGestureDetector;
    // ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        mGestureDetector = createGestureDetector(this);
    }
 
    private GestureDetector createGestureDetector(Context context) {
    GestureDetector gestureDetector = new GestureDetector(context);
        //Create a base listener for generic gestures
        gestureDetector.setBaseListener( new GestureDetector.BaseListener() {
            @Override
            public boolean onGesture(Gesture gesture) {
                if (gesture == Gesture.TAP) {
                    // do something on tap
                    return true;
                } else if (gesture == Gesture.TWO_TAP) {
                    // do something on two finger tap
                    return true;
                } else if (gesture == Gesture.SWIPE_RIGHT) {
                    // do something on right (forward) swipe
                    return true;
                } else if (gesture == Gesture.SWIPE_LEFT) {
                    // do something on left (backwards) swipe
                    return true;
                }
                return false;
            }
        });
        gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
            @Override
            public void onFingerCountChanged(int previousCount, int currentCount) {
              // do something on finger count changes
            }
        });
        gestureDetector.setScrollListener(new GestureDetector.ScrollListener() {
            @Override
            public boolean onScroll(float displacement, float delta, float velocity) {
                // do something on scrolling
            }
        });
        return gestureDetector;
    }
 
    /*
     * Send generic motion events to the gesture detector
     */
    @Override
    public boolean onGenericMotionEvent(MotionEvent event) {
        if (mGestureDetector != null) {
            return mGestureDetector.onMotionEvent(event);
        }
        return false;
    }
}



识别view层级的手势


1、创建 一个自定义view并重写 dispatchGenericFocusedEvent() 方法。当一个motion 时间发生时,这个方法传入motion事件给gesture detector。


2、设置view为focusable ,以便当view获取焦点的时候能检测到事件。


3、创建一个 GestureDetector 的监听来处理识别的手势




当gesture detector识别到一个motion 的时候,gesture detector通知相关的监听接口来处理事件。


/**
 * TextView that handles touchpad input (currently only TAP).
 */
public class TouchpadHandlingTextView extends TextView
        implements OnAttachStateChangeListener{
 
    private final GestureDetector mTouchDetector;
 
    public TouchpadHandlingTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTouchDetector = createGestureDetector(context);
        // must set the view to be focusable
        setFocusable(true);
        setFocusableInTouchMode(true);
    }
 
    public TouchpadHandlingTextView(Context context) {
        this(context, null);
    }
 
    @Override
    public void onViewAttachedToWindow(View v) {
        requestFocus();
    }
 
    @Override
    public void onViewDetachedFromWindow(View v) {
    }
 
    /**
     * Pass a MotionEvent into the gesture detector
     */
    @Override
    public boolean dispatchGenericFocusedEvent(MotionEvent event) {
        if (isFocused()) {
            return mTouchDetector.onMotionEvent(event);
        }
        return super.dispatchGenericFocusedEvent(event);
    }
 
    /**
     * Create gesture detector that triggers onClickListener. Implement
     * onClickListener in your Activity and override
     * onClick() to handle the "tap" gesture.
     */
    private GestureDetector createGestureDetector(Context context) {
        GestureDetector gd = new GestureDetector(context);
        gd.setBaseListener(new GestureDetector.BaseListener() {
 
            @Override
            public boolean onGesture(Gesture gesture) {
                if (gesture == Gesture.TAP) {
                    return performClick();
                }
                return false;
            }
        });
        return gd;
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值