RippleButton类在一个python脚本中工作,但在处理屏幕时却没有

时间:2019-02-08 17:06:06

标签: python kivy

虽然我使用rippleexample2.kv运行此脚本涟漪示例2.py,但按钮在按下时应具有涟漪效果,但不起作用。我知道ctmbtn.py中的RippleButton类工作正常,当在此处按下按钮时,会产生涟漪效应。我不知道这是怎么回事。也许绑定功能?谢谢你。

rippleexample2.py

from kivy.app import App
from kivy.uix.touchripple import TouchRippleBehavior
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.properties import (StringProperty, NumericProperty, ObjectProperty, ListProperty, DictProperty, BooleanProperty)

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)


class Login(Screen):
    pass

class MainScreen(Screen):
    pass

class ScreenManager(ScreenManager):
    pass

Login = Builder.load_file("rippleexample2.kv")

class SimpleKivy4(App):
    def build(self):
        return Login

if __name__ == "__main__":
    SimpleKivy4().run()

rippleexample2.kv

ScreenManager:
    Login:
    MainScreen:

<Login>:
    name:"login"
    RippleButton:
        text:'Login'
        font_size: 24
        size_hint: (.4,.25)
        on_release: app.root.current = "main"

<MainScreen>:
    name: "main"
    Button:
        text: 'back'
        on_release: app.root.current = "login"

ctmbtn.py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import (StringProperty, NumericProperty, ObjectProperty,
ListProperty, DictProperty, BooleanProperty)
from kivy.uix.touchripple import TouchRippleBehavior

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)


class RootWidget(BoxLayout):
    def __init__(self, **kwargs):
        super(RootWidget, self).__init__(**kwargs)
        self.add_widget(RippleButton(text='btn 1'))
        cb = CustomBtn()
        cb.bind(pressed=self.btn_pressed)
        self.add_widget(cb)
        self.add_widget(RippleButton(text='btn 2'))

    def btn_pressed(self, instance, pos):
        print ('pos: printed from root widget: {pos}'.format(pos=pos))

class CustomBtn(Widget):
    pressed = ListProperty([0, 0])

    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            self.pressed = touch.pos
            # we consumed the touch. return False here to propagate
            # the touch further to the children.
            return True
        return super(CustomBtn, self).on_touch_down(touch)

    def on_pressed(self, instance, pos):
        print ('pressed at {pos}'.format(pos=pos))

class TestApp(App):
    def build(self):
        return RootWidget()

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

1 个答案:

答案 0 :(得分:0)

Touch Ripple代码仍处于试验阶段,以kv语言用于Button小部件时看不到它。

实际上,使用kv语言时,交互上的Button触摸波纹动画有效。它只是不可见,因为“按钮”小部件的background_color(r,g,b,a)默认为[1、1、1、1、1]或不透明的灰色。因此,“ a”(alpha合成或透明度)为1,即不透明。

波纹颜色默认为[1,。,1,.. 5]或半透明的灰色。

解决方案

暂时的解决方法是将Button小部件的alpha合成或透明度更改为0.5。

请参考我的示例Kivy RippleButton