touch_manager.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import logging
  2. import time
  3. import pygame
  4. logger = logging.getLogger(__name__)
  5. class TouchManager():
  6. click = 1
  7. swipe = 2
  8. long_click = 3
  9. long_click_min_time = 0.3
  10. up = 0
  11. down = 1
  12. left = 2
  13. right = 3
  14. def __init__(self, size):
  15. self.down_pos = (0, 0)
  16. self.up_pos = (0, 0)
  17. self.screen_size = size
  18. self.max_move_margin = self.screen_size[1] / 6
  19. self.min_swipe_move = self.screen_size[1] / 3
  20. self.down_button = -1
  21. self.down_time = -1
  22. def event(self, event):
  23. if event.type == pygame.MOUSEBUTTONUP:
  24. if event.button == 4:
  25. touch_event = TouchEvent(TouchManager.swipe, self.down_pos,
  26. self.up_pos, True)
  27. touch_event.direction = TouchManager.up
  28. return touch_event
  29. elif event.button == 5:
  30. touch_event = TouchEvent(TouchManager.swipe, self.down_pos,
  31. self.up_pos, True)
  32. touch_event.direction = TouchManager.down
  33. return touch_event
  34. elif event.button == 1 and self.down_button == 1:
  35. touch_event = self.mouse_up(event)
  36. return touch_event
  37. elif event.button == 3 and self.down_button == 3:
  38. touch_event = TouchEvent(TouchManager.long_click,
  39. self.down_pos, self.up_pos, None)
  40. return touch_event
  41. else:
  42. return None
  43. elif event.type == pygame.MOUSEBUTTONDOWN:
  44. self.mouse_down(event)
  45. return None
  46. def mouse_down(self, event):
  47. self.down_pos = event.pos
  48. self.down_button = event.button
  49. self.down_time = time.time()
  50. def mouse_up(self, event):
  51. self.up_pos = event.pos
  52. if abs(self.down_pos[0] - self.up_pos[0]) < self.max_move_margin:
  53. if abs(self.down_pos[1] - self.up_pos[1]) < self.max_move_margin:
  54. if time.time() - TouchManager.long_click_min_time > \
  55. self.down_time:
  56. return TouchEvent(TouchManager.long_click, self.down_pos,
  57. self.up_pos, None)
  58. else:
  59. return TouchEvent(TouchManager.click, self.down_pos,
  60. self.up_pos, None)
  61. elif abs(self.down_pos[1] - self.up_pos[1]) > self.min_swipe_move:
  62. return TouchEvent(TouchManager.swipe, self.down_pos,
  63. self.up_pos, True)
  64. elif self.down_pos[1] - self.up_pos[1] < self.max_move_margin:
  65. if abs(self.down_pos[0] - self.up_pos[0]) > self.min_swipe_move:
  66. return TouchEvent(TouchManager.swipe, self.down_pos,
  67. self.up_pos, False)
  68. class TouchEvent():
  69. def __init__(self, event_type, down_pos, current_pos, vertical):
  70. self.type = event_type
  71. self.down_pos = down_pos
  72. self.current_pos = current_pos
  73. if event_type is TouchManager.swipe:
  74. if vertical:
  75. if self.down_pos[1] < self.current_pos[1]:
  76. self.direction = TouchManager.down
  77. else:
  78. self.direction = TouchManager.up
  79. else:
  80. if self.down_pos[0] < self.current_pos[0]:
  81. self.direction = TouchManager.right
  82. else:
  83. self.direction = TouchManager.left