/ime/latinime/src/com/googlecode/eyesfree/inputmethod/SegmentDetector.java

http://eyes-free.googlecode.com/ · Java · 94 lines · 75 code · 15 blank · 4 comment · 20 complexity · e145baea5845c9c81c80bb4223c015c6 MD5 · raw file

  1. // Copyright 2011 Google Inc. All Rights Reserved.
  2. package com.googlecode.eyesfree.inputmethod;
  3. import android.view.MotionEvent;
  4. import android.view.View;
  5. /**
  6. * @author alanv@google.com (Alan Viverette)
  7. */
  8. public class SegmentDetector {
  9. private static final int NUM_SEGMENTS = 5;
  10. private static final float CANCEL_SIZE = 0.25f;
  11. public static final int SEGMENT_INVALID = -2;
  12. public static final int SEGMENT_CANCEL = -1;
  13. private SegmentListener mListener;
  14. private MotionEvent mLeftEvent;
  15. private int mSegmentSize;
  16. private int mCancelLeft;
  17. private int mCancelRight;
  18. private int mPreviousSegment;
  19. public void setListener(SegmentListener listener) {
  20. mListener = listener;
  21. }
  22. public void updateDimensions(View v) {
  23. int width = v.getWidth();
  24. int cancelSize = (int) (v.getResources().getDisplayMetrics().xdpi * CANCEL_SIZE);
  25. mSegmentSize = (int) (0.5 * width / NUM_SEGMENTS);
  26. mCancelLeft = cancelSize;
  27. mCancelRight = width - cancelSize;
  28. }
  29. public boolean onTouchEvent(MotionEvent event) {
  30. if (event.getY() >= 0 || event.getPointerCount() > 1) {
  31. if (mLeftEvent != null) {
  32. if (mListener != null) {
  33. mListener.onEnteredKeyboard();
  34. }
  35. mLeftEvent = null;
  36. mPreviousSegment = SEGMENT_INVALID;
  37. }
  38. return false;
  39. }
  40. if (mLeftEvent == null) {
  41. if (mListener != null) {
  42. mListener.onLeftKeyboard();
  43. }
  44. mLeftEvent = MotionEvent.obtainNoHistory(event);
  45. mPreviousSegment = SEGMENT_INVALID;
  46. }
  47. int currentSegment;
  48. float x = event.getX();
  49. if (x < mCancelLeft || x >= mCancelRight) {
  50. currentSegment = SEGMENT_CANCEL;
  51. } else {
  52. currentSegment = (int) (Math.abs(x - mLeftEvent.getX()) / mSegmentSize);
  53. }
  54. switch (event.getAction()) {
  55. case MotionEvent.ACTION_MOVE:
  56. if (currentSegment != mPreviousSegment) {
  57. if (mListener != null) {
  58. mListener.onEnteredSegment(currentSegment);
  59. }
  60. mPreviousSegment = currentSegment;
  61. }
  62. break;
  63. case MotionEvent.ACTION_UP:
  64. if (mListener != null) {
  65. mListener.onSelectedSegment(currentSegment);
  66. }
  67. mLeftEvent = null;
  68. mPreviousSegment = SEGMENT_INVALID;
  69. break;
  70. }
  71. return true;
  72. }
  73. public interface SegmentListener {
  74. public void onLeftKeyboard();
  75. public void onEnteredKeyboard();
  76. public void onEnteredSegment(int segmentId);
  77. public void onSelectedSegment(int segmentId);
  78. }
  79. }