找出图形对象是否被触及了kivy

时间:2016-03-16 14:37:29

标签: android python user-interface kivy

当我触及MyPaintWidget时,会在其canvas中创建一个椭圆。 但我还想检测用户何时触摸已绘制的椭圆,以便我可以执行其他指令而不是再次绘制椭圆。 我看到self.collide_point仅适用于Widget s。

有替代解决方案吗?

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse

class MyPaintWidget(Widget):
    def on_touch_down(self,touch):
        with self.canvas:
            Color(1,1,0)
            d=30
            Ellipse(pos=(touch.x-d/2,touch.y-d/2),size=(d,d))

class MyPaintApp(App):
    def build(self):
        return MyPaintWidget()

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

1 个答案:

答案 0 :(得分:1)

您可以将椭圆的中心和半径存储在ListProperty MyPaintWidget中。在on_touch_down中,您可以检查是否与任何省略号发生冲突,并绘制另一个省略号或执行其他操作。在下面的示例中,我添加了第二个半径以显示常规解决方案。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse
from kivy.properties import ListProperty

class MyPaintWidget(Widget):
    ellipses = ListProperty()
    def touch_hits_ellipse(self, touch):
        return [ind for ind, e in enumerate(self.ellipses) if (touch.x - e[0] )**2.0/(e[2])**2.0 + (touch.y - e[1])**2/(e[3])**2 <= 1]

    def on_touch_down(self,touch):
        hit_ellipse = self.touch_hits_ellipse(touch)
        if len(hit_ellipse) == 0:
            with self.canvas:
                Color(1,1,0)
                d=30
                d2=40
                Ellipse(pos=(touch.x-d/2,touch.y-d2/2),size=(d, d2))
            self.ellipses.append((touch.x, touch.y, d/2.0, d2/2))
        else:
            print "We hit ellipse(s) {}".format(hit_ellipse)

class MyPaintApp(App):
    def build(self):
        return MyPaintWidget()

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