เข้าถึงข้อมูลดิบจากทัชแพดของ 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 ที่สอดคล้องกัน
ท่าทางสัมผัสตรวจจับมีอินเทอร์เฟซ Listener ที่คุณสามารถนําไปใช้รับการแจ้งเตือนเกี่ยวกับท่าทางสัมผัส
การตรวจหาท่าทางสัมผัสระดับกิจกรรม
การตรวจจับท่าทางสัมผัสที่ระดับกิจกรรมจะเหมาะสมเมื่อคุณไม่สนใจว่าส่วนใดของ UI ที่เน้น ตัวอย่างเช่น หากคุณต้องการเปิดเมนูเมื่อผู้ใช้แตะทัชแพด ไม่ว่ามุมมองจะโฟกัสอยู่ที่ใดก็ตาม คุณจะจัดการ MotionEvent
ภายในกิจกรรมได้
ตัวอย่างต่อไปนี้
- สร้าง
GestureDetector
ที่ใช้ Listener ในการประมวลผลท่าทางสัมผัสที่รู้จัก - ลบล้างเมธอด
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
ที่ใช้ Listener ในการประมวลผลท่าทางสัมผัสที่รู้จัก
เมื่อตัวตรวจจับท่าทางสัมผัสตรวจจับการเคลื่อนไหวได้ขณะอยู่ในโฟกัส ตัวตรวจจับท่าทางสัมผัสจะโทรหาผู้ฟังที่เหมาะสม
/**
* 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;
}
}