可以透過以下方式使用 Glass 觸控板存取原始資料: Android SDK
不過 GDK 提供了 手勢偵測工具 自動偵測 Glass 的常用手勢,包括 輕觸、滑動及捲動畫面
此外,簡單的手勢會轉譯為 預設為 D-Pad 事件,以便在沒有資料的情況下輕鬆處理 支援手勢偵測工具
將手勢偵測為 D-Pad 按鍵事件
根據預設,Glass 系統會將簡單的手勢轉譯成 D-Pad 的重要事件。這個
讓你聽
onKeyDown()
敬上
和 onKeyUp()
活動或檢視畫面的事件,以便將下列手勢當做 D-Pad 鍵處理:
- 輕觸「譯文語言」
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
敬上
以及檢視畫面使用者輕觸觸控板時 (按一下後會變成 D-Pad 的中央按鈕)
聚焦於檢視畫面,檢視畫面可以藉由
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
}
}
使用手勢偵測工具偵測手勢
手勢偵測工具也可以偵測簡易手勢 視為更複雜的手勢 像是用多根手指或捲動畫面的複合式園區 手勢沒有對應的 D-Pad 鍵。
GestureDetector 提供了可讓您實作的事件監聽器介面 接收手勢的通知。
偵測活動層級的手勢
在活動層級偵測手勢是可行的
如果不在乎 UI 的哪個部分
具有焦點例如,您希望在 Google 新聞
使用者輕觸觸控板時,無論焦點位於哪個檢視畫面,
處理 MotionEvent
在活動內。
以下範例會執行下列操作:
- 建立
GestureDetector
實作事件監聽器來處理可辨識的手勢。 - 覆寫活動的
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;
}
}