原文地址: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;
}
}