谷歌眼鏡GDK開發指南之觸控手勢

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


這是一小段觸控事件的代碼:


  1. publicclass MyActivity extends Activity {  

  2.    ...  

  3. @Override

  4. publicboolean onKeyDown(int keycode, KeyEvent event) {  

  5. if (keycode == KeyEvent.KEYCODE_DPAD_CENTER) {  

  6. // user tapped touchpad, do something

  7. returntrue;  

  8.        }  

  9.        ...  

  10. returnfalse;  

  11.    }  

  12. }  





通過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通知相關的監聽接口來處理事件。


  1. publicclass MainActivity extends Activity {  

  2. private GestureDetector mGestureDetector;  

  3. // ...

  4. @Override

  5. protectedvoid onCreate(Bundle savedInstanceState) {  

  6. // ...

  7.        mGestureDetector = createGestureDetector(this);  

  8.    }  

  9. private GestureDetector createGestureDetector(Context context) {  

  10.    GestureDetector gestureDetector = new GestureDetector(context);  

  11. //Create a base listener for generic gestures

  12.        gestureDetector.setBaseListener( new GestureDetector.BaseListener() {  

  13. @Override

  14. publicboolean onGesture(Gesture gesture) {  

  15. if (gesture == Gesture.TAP) {  

  16. // do something on tap

  17. returntrue;  

  18.                } elseif (gesture == Gesture.TWO_TAP) {  

  19. // do something on two finger tap

  20. returntrue;  

  21.                } elseif (gesture == Gesture.SWIPE_RIGHT) {  

  22. // do something on right (forward) swipe

  23. returntrue;  

  24.                } elseif (gesture == Gesture.SWIPE_LEFT) {  

  25. // do something on left (backwards) swipe

  26. returntrue;  

  27.                }  

  28. returnfalse;  

  29.            }  

  30.        });  

  31.        gestureDetector.setFingerListener(new GestureDetector.FingerListener() {  

  32. @Override

  33. publicvoid onFingerCountChanged(int previousCount, int currentCount) {  

  34. // do something on finger count changes

  35.            }  

  36.        });  

  37.        gestureDetector.setScrollListener(new GestureDetector.ScrollListener() {  

  38. @Override

  39. publicboolean onScroll(float displacement, float delta, float velocity) {  

  40. // do something on scrolling

  41.            }  

  42.        });  

  43. return gestureDetector;  

  44.    }  

  45. /*

  46.     * Send generic motion events to the gesture detector

  47.     */

  48. @Override

  49. publicboolean onGenericMotionEvent(MotionEvent event) {  

  50. if (mGestureDetector != null) {  

  51. return mGestureDetector.onMotionEvent(event);  

  52.        }  

  53. returnfalse;  

  54.    }  

  55. }  





識別view層級的手勢


1、創建 一個自定義view並重寫 dispatchGenericFocusedEvent() 方法。當一個motion 時間發生時,這個方法傳入motion事件給gesture detector。


2、設置view爲focusable ,以便當view獲取焦點的時候能檢測到事件。


3、創建一個 GestureDetector 的監聽來處理識別的手勢




當gesture detector識別到一個motion 的時候,gesture detector通知相關的監聽接口來處理事件。


  1. /**

  2. * TextView that handles touchpad input (currently only TAP).

  3. */

  4. publicclass TouchpadHandlingTextView extends TextView  

  5. implements OnAttachStateChangeListener{  

  6. privatefinal GestureDetector mTouchDetector;  

  7. public TouchpadHandlingTextView(Context context, AttributeSet attrs) {  

  8. super(context, attrs);  

  9.        mTouchDetector = createGestureDetector(context);  

  10. // must set the view to be focusable

  11.        setFocusable(true);  

  12.        setFocusableInTouchMode(true);  

  13.    }  

  14. public TouchpadHandlingTextView(Context context) {  

  15. this(context, null);  

  16.    }  

  17. @Override

  18. publicvoid onViewAttachedToWindow(View v) {  

  19.        requestFocus();  

  20.    }  

  21. @Override

  22. publicvoid onViewDetachedFromWindow(View v) {  

  23.    }  

  24. /**

  25.     * Pass a MotionEvent into the gesture detector

  26.     */

  27. @Override

  28. publicboolean dispatchGenericFocusedEvent(MotionEvent event) {  

  29. if (isFocused()) {  

  30. return mTouchDetector.onMotionEvent(event);  

  31.        }  

  32. returnsuper.dispatchGenericFocusedEvent(event);  

  33.    }  

  34. /**

  35.     * Create gesture detector that triggers onClickListener. Implement

  36.     * onClickListener in your Activity and override

  37.     * onClick() to handle the "tap" gesture.

  38.     */

  39. private GestureDetector createGestureDetector(Context context) {  

  40.        GestureDetector gd = new GestureDetector(context);  

  41.        gd.setBaseListener(new GestureDetector.BaseListener() {  

  42. @Override

  43. publicboolean onGesture(Gesture gesture) {  

  44. if (gesture == Gesture.TAP) {  

  45. return performClick();  

  46.                }  

  47. returnfalse;  

  48.            }  

  49.        });  

  50. return gd;  

  51.    }  

  52. }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章