ท่าทางแตะสัมผัส

คุณสามารถเข้าถึงข้อมูลดิบจากทัชแพด 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 มีอินเทอร์เฟซ Listener ที่คุณสามารถนำไปใช้ เพื่อรับการแจ้งเตือนเกี่ยวกับท่าทางสัมผัส

กำลังตรวจหาท่าทางสัมผัสระดับกิจกรรม

การตรวจหาท่าทางสัมผัสในระดับกิจกรรมมีความเหมาะสม เมื่อคุณไม่สนใจว่า UI ส่วนใด มีสมาธิ ตัวอย่างเช่น ถ้าต้องการแสดงเมนู เมื่อผู้ใช้แตะทัชแพด ไม่ว่ามุมมองจะเป็นอย่างไรก็ตาม คุณจะจัดการ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;
    }
}