谷歌眼镜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


这是一小段触控事件的代码:


[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  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通知相关的监听接口来处理事件。


[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  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通知相关的监听接口来处理事件。


[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  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. }  


你可能感兴趣的:(android,谷歌,gesture,触控板,通用)