on_touch_down在on_touch_move时不应更新计数器 - kivy

0 投票
1 回答
550 浏览
提问于 2025-04-18 05:06

我正在使用 on_touch_down 和 on_touch_move 这两个功能,并且需要在每次移动或触摸时更新计数器。
不过,我不想在只是移动的时候更新触摸计数,因为默认情况下,即使只是移动,它也会把触摸计数加 1。我觉得这是因为移动事件会先检测到触摸事件,但有没有办法解决这个问题呢?

下面是一个示例代码。

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout

class JB(BoxLayout):
    def __init__(self, **kwargs):
        super(JB, self).__init__(**kwargs)
        self.touch_move_count = 0
        self.touch_down_count = 0
        self.touch_move_Label = Label()
        self.touch_down_Label = Label()
        self.update_count()
        self.add_widget(self.touch_down_Label)
        self.add_widget(self.touch_move_Label)

    def update_count(self):
        self.touch_down_Label.text = "Touch Down Count : %s"%str(self.touch_down_count)
        self.touch_move_Label.text = "Touch Move Count : %s"%str(self.touch_move_count)

    def on_touch_down(self, touch):
        self.touch_down_count += 1
        print "down", self.touch_down_count
        self.update_count()

    def on_touch_move(self, touch):
        self.touch_move_count += 1
        print "moved", self.touch_move_count
        self.update_count()


class MyJBApp(App):
    def build(self):
        self.parent = JB()
        return self.parent

if __name__ == '__main__':
    MyJBApp().run()

1 个回答

1

在你移动之前,你已经触碰到了按钮——触碰事件总是会被发送,因为在那一刻,应用程序并不知道你是否会移动。如果你想知道有没有触碰而没有移动的情况,你可以使用触碰抬起事件来判断:

def on_touch_down(self, touch):
    self.is_touch_down = True

def on_touch_up(self, touch):
    if self.is_touch_down:
        self.touch_down_count += 1
        print "down", self.touch_down_count
        self.update_count()
    self.is_touch_down = False

def on_touch_move(self, touch):
    self.is_touch_down = False
    self.touch_move_count += 1
    print "moved", self.touch_move_count
    self.update_count()

你也可以做一些更复杂的事情,比如在on_touch_down中保存收到的触碰信息,然后在on_touch_up中检查一下这个位置是否在某个容忍范围内(比如4像素之类的)。

撰写回答