kivyblocks/kivyblocks/swipebehavior.py

119 lines
3.3 KiB
Python
Raw Normal View History

2020-04-27 16:48:55 +08:00
import time
from kivy.logger import Logger
2020-04-29 10:43:38 +08:00
class SwipeBehavior(object):
2020-04-27 16:48:55 +08:00
def __init__(self, **kwargs):
2020-04-29 10:43:38 +08:00
object.__init__(self)
2020-07-12 23:02:07 +08:00
self.swipeenable = True
2020-04-27 16:48:55 +08:00
self.register_event_type('on_context_menu')
self.register_event_type('on_swipe_left')
self.register_event_type('on_swipe_right')
self.register_event_type('on_swipe_up')
self.register_event_type('on_swipe_down')
self.sb_start_point = None
self.sb_end_point = None
self.sb_start_time = None
self.sb_end_time = None
self.threshold=20
2020-07-12 23:02:07 +08:00
self.threshold_time = 0.6
2020-04-29 10:43:38 +08:00
self.bind(on_touch_down=self.on_touchdown)
self.bind(on_touch_move=self.on_touchmove)
self.bind(on_touch_up=self.on_touchup)
2020-04-27 16:48:55 +08:00
2020-07-12 23:02:07 +08:00
def disable_swipe(self):
self.swipeenable = False
def enable_swipe(self):
self.swipeenable = True
2020-04-27 16:48:55 +08:00
def on_context_menu(self):
2020-07-13 17:06:55 +08:00
pass
# Logger.info('SwipeBehavior:on_context_menu fired')
2020-04-27 16:48:55 +08:00
def on_swipe_left(self):
2020-07-13 17:06:55 +08:00
pass
# Logger.info('SwipeBehavior:on_swipe_left fired')
2020-04-27 16:48:55 +08:00
def on_swipe_right(self):
2020-07-13 17:06:55 +08:00
pass
# Logger.info('SwipeBehavior:on_swipe_right fired')
2020-04-27 16:48:55 +08:00
def on_swipe_up(self):
2020-07-13 17:06:55 +08:00
pass
# Logger.info('SwipeBehavior:on_swipe_up fired')
2020-04-27 16:48:55 +08:00
def on_swipe_down(self):
2020-07-13 17:06:55 +08:00
pass
# Logger.info('SwipeBehavior:on_swipe_down fired')
2020-04-27 16:48:55 +08:00
2020-07-12 23:02:07 +08:00
def on_touchdown(self,o, touch):
if touch.is_mouse_scrolling:
2020-07-13 17:06:55 +08:00
# Logger.info('SwipeBehavior:is_mouse_scrolling')
2020-07-12 23:02:07 +08:00
return False
if not self.collide_point(touch.x, touch.y):
return False
2020-07-13 17:06:55 +08:00
# Logger.info('SwipeBehavior:touch_down fired')
2020-07-12 23:02:07 +08:00
if self.swipeenable:
2020-07-13 17:06:55 +08:00
# Logger.info('SwipeBehavior:touch_down fired')
2020-04-29 10:43:38 +08:00
self.sb_start_point = touch.pos
2020-04-27 16:48:55 +08:00
self.sb_start_time = time.time()
2020-04-29 10:43:38 +08:00
def on_touchmove(self,o,touch):
2020-07-12 23:02:07 +08:00
if self.collide_point(*touch.pos) and self.swipeenable:
2020-07-13 17:06:55 +08:00
# Logger.info('SwipeBehavior:touch_move fired')
2020-04-27 16:48:55 +08:00
if self.sb_start_point is None:
self.sb_start_point = touch.pos
else:
self.sb_end_point = touch.pos
2020-04-29 10:43:38 +08:00
def on_touchup(self,o,touch):
2021-01-26 18:03:28 +08:00
ret = False
2020-07-12 23:02:07 +08:00
if self.collide_point(*touch.pos) and self.swipeenable:
2020-07-13 17:06:55 +08:00
# Logger.info('SwipeBehavior:touch_up fired')
2020-04-27 16:48:55 +08:00
self.sb_end_point = touch.pos
self.sb_end_time = time.time()
self.check_context_menu()
2021-01-26 18:03:28 +08:00
ret = True
2020-04-27 16:48:55 +08:00
self.check_swipe()
self.sb_start_point = None
self.sb_end_point = None
self.sb_start_time = None
self.sb_end_time = None
def check_context_menu(self):
if not self.sb_start_time:
return
if not self.sb_end_time:
return
2020-07-12 23:02:07 +08:00
period_time = self.sb_end_time - self.sb_start_time
2020-07-13 17:06:55 +08:00
# Logger.info('SwipeBehavior:period_time=%f,threshold_time=%f',
# period_time, self.threshold_time)
2020-07-12 23:02:07 +08:00
if period_time >= self.threshold_time:
2020-04-27 16:48:55 +08:00
self.dispatch('on_context_menu')
def check_swipe(self):
2020-04-30 00:02:42 +08:00
if not self.sb_end_point:
return
if not self.sb_start_point:
return
2020-04-29 10:43:38 +08:00
if abs(self.sb_end_point[0] - self.sb_start_point[0]) > \
abs(self.sb_end_point[1] - self.sb_start_point[1]):
Logger.info('SwipeBehavior:check_swipe x>y')
if self.sb_end_point[0] - self.sb_start_point[0] >= \
self.threshold:
2020-04-27 16:48:55 +08:00
self.dispatch('on_swipe_right')
2020-04-29 10:43:38 +08:00
elif self.sb_start_point[0] - self.sb_end_point[0] >= \
self.threshold:
2020-04-27 16:48:55 +08:00
self.dispatch('on_swipe_left')
else:
2020-07-13 17:06:55 +08:00
# Logger.info('SwipeBehavior:check_swipe x<y')
2020-04-29 10:43:38 +08:00
if self.sb_end_point[1] - self.sb_start_point[1] >= \
self.threshold:
2020-04-27 16:48:55 +08:00
self.dispatch('on_swipe_up')
2020-04-29 10:43:38 +08:00
elif self.sb_start_point[1] - self.sb_end_point[1] >= \
self.threshold:
2020-04-27 16:48:55 +08:00
self.dispatch('on_swipe_down')