原文地址: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
这是一小段触控事件的代码:
publicclass MyActivity extends Activity {
...
@Override
publicboolean onKeyDown(int keycode, KeyEvent event) {
if (keycode == KeyEvent.KEYCODE_DPAD_CENTER) {
// user tapped touchpad, do something
returntrue;
}
...
returnfalse;
}
}
通过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通知相关的监听接口来处理事件。
publicclass MainActivity extends Activity {
private GestureDetector mGestureDetector;
// ...
@Override
protectedvoid 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
publicboolean onGesture(Gesture gesture) {
if (gesture == Gesture.TAP) {
// do something on tap
returntrue;
} elseif (gesture == Gesture.TWO_TAP) {
// do something on two finger tap
returntrue;
} elseif (gesture == Gesture.SWIPE_RIGHT) {
// do something on right (forward) swipe
returntrue;
} elseif (gesture == Gesture.SWIPE_LEFT) {
// do something on left (backwards) swipe
returntrue;
}
returnfalse;
}
});
gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
@Override
publicvoid onFingerCountChanged(int previousCount, int currentCount) {
// do something on finger count changes
}
});
gestureDetector.setScrollListener(new GestureDetector.ScrollListener() {
@Override
publicboolean onScroll(float displacement, float delta, float velocity) {
// do something on scrolling
}
});
return gestureDetector;
}
/*
* Send generic motion events to the gesture detector
*/
@Override
publicboolean onGenericMotionEvent(MotionEvent event) {
if (mGestureDetector != null) {
return mGestureDetector.onMotionEvent(event);
}
returnfalse;
}
}
识别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).
*/
publicclass TouchpadHandlingTextView extends TextView
implements OnAttachStateChangeListener{
privatefinal 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
publicvoid onViewAttachedToWindow(View v) {
requestFocus();
}
@Override
publicvoid onViewDetachedFromWindow(View v) {
}
/**
* Pass a MotionEvent into the gesture detector
*/
@Override
publicboolean dispatchGenericFocusedEvent(MotionEvent event) {
if (isFocused()) {
return mTouchDetector.onMotionEvent(event);
}
returnsuper.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
publicboolean onGesture(Gesture gesture) {
if (gesture == Gesture.TAP) {
return performClick();
}
returnfalse;
}
});
return gd;
}
}