觸控手勢

可以透過以下方式使用 Glass 觸控板存取原始資料: Android SDK

不過 GDK 提供了 手勢偵測工具 自動偵測 Glass 的常用手勢,包括 輕觸、滑動及捲動畫面

此外,簡單的手勢會轉譯為 預設為 D-Pad 事件,以便在沒有資料的情況下輕鬆處理 支援手勢偵測工具

將手勢偵測為 D-Pad 按鍵事件

根據預設,Glass 系統會將簡單的手勢轉譯成 D-Pad 的重要事件。這個 讓你聽 onKeyDown()敬上 和 onKeyUp() 活動或檢視畫面的事件,以便將下列手勢當做 D-Pad 鍵處理:

下列程式碼片段可偵測使用者何時輕觸觸控板:

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 在活動內。

以下範例會執行下列操作:

  1. 建立 GestureDetector 實作事件監聽器來處理可辨識的手勢。
  2. 覆寫活動的 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;
    }
}

偵測檢視區塊層級手勢

您可以執行以下動作,在檢視畫面層級偵測手勢: 執行不同工作

以下範例會執行下列操作:

  1. 建立自訂檢視畫面來覆寫 dispatchGenericFocusedEvent()敬上 方法。發生動作事件時,這個方法會將動作事件傳遞至手勢偵測工具。
  2. 宣告檢視畫面為可聚焦,使其在其處於聚焦時偵測事件。
  3. 建立將 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;
    }
}