Применить TouchRippleBehavior или TouchRippleButtonBehavior к кнопке в Киви? - PullRequest
0 голосов
/ 02 апреля 2020

Мне было интересно, как реализовать кнопку TouchRippleBehavior или TouchRippleButtonBehavior на кнопке в Kivy. Я пробовал это:

class RippleLabel(TouchRippleBehavior, Label):
   def __init__(self, **kwargs):
       super(RippleLabel, self).__init__(**kwargs)

   def on_touch_down(self, touch):
       collide_point = self.collide_point(touch.x, touch.y)
       if collide_point:
          touch.grab(self)
          self.ripple_show(touch)
          return True
       return False

   def on_touch_up(self, touch):
       if touch.grab_current is self:
          touch.ungrab(self)
          self.ripple_fade()
          return True
       return False

app = Builder.load_string('''

   Button:
      background_normal: 'image.jpg'
      RippleLabel:
         on_touch_down: self.root.on_touch_down()
         on_touch.up: self.root.on_touch__up()
         text: "Test"
''')

class ButtonApp(App):
   def build(self):
       return app

ButtonApp().run()

Я получаю сообщение об ошибке AttributeError: 'NoneType' object has no attribute 'children'. Как применить эффект ряби к кнопке при ее нажатии?

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете сделать это с Button очень похоже на то, как вы это сделали для Label:

class RippleButton(TouchRippleBehavior, Button):

    isRippled = BooleanProperty(False)

    def __init__(self, **kwargs):
        super(RippleButton, self).__init__(**kwargs)

    def on_touch_down(self, touch):
        collide_point = self.collide_point(touch.x, touch.y)
        if collide_point and not self.isRippled:
            self.isRippled = True
            self.ripple_show(touch)
        return super(RippleButton, self).on_touch_down(touch)

    def on_touch_up(self, touch):
        collide_point = self.collide_point(touch.x, touch.y)
        if collide_point and self.isRippled:
            self.isRippled = False
            self.ripple_fade()
        return super(RippleButton, self).on_touch_up(touch)
...