可通过 Google Glass 触控板访问原始数据, Android SDK。
不过,GDK 提供了 手势检测器 自动检测 Glass 上的常用手势,包括 例如点按、滑动和滚动
此外,还可以将简单的手势 默认使用方向键事件,无需 手势检测。
将手势检测为方向键按键事件
默认情况下,Glass 系统会将简单的手势转换为方向键按键事件。这个
可让你通过
onKeyDown()
和onKeyUp()
事件,以便将以下手势作为方向键进行处理:
- 点按“翻译”可
KEYCODE_DPAD_CENTER
。 - 按下相机按钮的操作可转换为
KEYCODE_CAMERA
。 - 向下滑动会翻译成
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 super.onKeyDown(keycode, event);
}
}
检测单个视图上的点按的一个方法是
OnClickListener
视图当用户点按触控板时(已翻译为方向键中心的按钮点击)
在视图获得焦点的情况下,视图可以使用
OnClickListener
。
public final class MyActivity extends Activity implements OnClickListener {
View cardView;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
cardView = new Card(this).setText("Tap to carry out an action").getView();
// To receive touch events from the touchpad, the view should be focusable.
cardView.setOnClickListener(this);
cardView.setFocusable(true);
cardView.setFocusableInTouchMode(true);
setContentView(cardView);
}
@Override
protected void onResume() {
// To receive touch events from the touchpad, the view should have focus.
cardView.requestFocus();
super.onResume();
}
@Override
public void onClick(View v) {
// perform desired action
}
}
使用手势检测器检测手势
手势检测器还能让您检测简单的手势 更复杂的手势 例如使用多根手指或滚动屏幕的操作。复杂 手势没有对应的方向键。
GestureDetector 提供了监听器接口 收到手势的通知。
检测 activity 级手势
在 activity 级别检测手势是合适的做法
而不在意界面的哪个部分
获得焦点。例如,如果您想打开一个菜单
当用户点按触控板时,无论焦点是哪个视图,
您将负责处理MotionEvent
这些代码
下面的示例:
- 创建
GestureDetector
实现监听器来处理识别出的手势。 - 替换 activity 的
onGenericMotionEvent()
方法,以将动作事件传递给手势检测器的onMotionEvent()
方法。
当发生动作事件时,系统会将该事件传递给手势检测器。如果 手势检测器会通知相应的监听器进行处理 事件。
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;
}
}
检测视图级手势
当您在视图级别上检测手势时, 您希望根据获得焦点的视图执行不同的操作。
下面的示例:
- 创建一个覆盖
dispatchGenericFocusedEvent()
方法。当发生动作事件时,此方法会将动作事件传递给手势检测器。 - 将视图声明为可聚焦,以便在该视图具有焦点时检测事件。
- 创建用于实现以下操作的
GestureDetector
: 监听器来处理识别出的手势。
当手势检测器在视图获得焦点时识别出动作时,手势检测器会调用相应的监听器。
/**
* 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;
}
}