KIVY collide_point вершина Прямоугольник - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть собственный виджет с прямоугольником и горизонтальной линией, созданный с помощью инструкции Vertex. Я хочу проверить, касается ли пользователь моего виджета внутри прямоугольника или горизонтальной линии. Попытка использования группы, но не удалось определить, коснулся ли пользователь прямоугольника или линии. Можете ли вы дать мне подсказку. Ниже приведен пример кода.

from kivy.app import App
from kivy.graphics import Line
from kivy.uix.scatter import Scatter
from kivy.uix.relativelayout import RelativeLayout
from kivy.lang import Builder

KV = '''
<Actor>:
    id: Actor
    canvas:
        Color:
            rgba: 0,1,0,1
        Rectangle:
            group: 'rect'
            size: 100, 30
            pos: 0, root.height - 30
        Line:
            group: 'line'
            points: 50, root.height - 30, 50, 0
            width:2
    Label:
        id: _actr_lbl
        text: 'Hello World'
        markup: True
        color: 0,0,0,1
        size_hint: None, None
        size: 100, 30
        pos: 0, root.height - 30
'''

class Actor(Scatter):
    def __init__(self, **kwargs):
        super(Actor, self).__init__(**kwargs)

    def on_touch_down(self, touch):

        print('Touch location {} Actor location {} Actor Size {}'.format(touch, self.pos, self.size))
        if self.collide_point(*touch.pos) :
           for aVertex in self.canvas.get_group('rect') :
               try:
                   print ('Vertex size {} and pos'.format(aVertex.size, aVertex.pos))
               except:
                   pass
           return True

        return super(Actor, self).on_touch_down(touch)

class MyPaintApp(App):

    def build(self):
        Builder.load_string(KV)
        root = RelativeLayout()
        root.add_widget(Actor(pos_hint={'center_x':0.5, 'center_y':0.5}, size_hint=(.2, 1.)))
        return root

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

Заранее спасибо

1 Ответ

1 голос
/ 28 апреля 2020

Вы можете сделать простой флажок ограничивающего прямоугольника, но вы должны принять во внимание тот факт, что touch находится в родительской системе координат. Таким образом, вы можете преобразовать позицию касания в локальные координаты, а затем выполнить тест. Вот пример для Rectangle:

def on_touch_down(self, touch):

    print('Touch location {} Actor location {} Actor Size {}'.format(touch, self.pos, self.size))
    if self.collide_point(*touch.pos) :
        localTouchPos = self.to_local(*touch.pos)
        for aVertex in self.canvas.get_group('rect') :
            print('\tVertex size {} and pos {}'.format(aVertex.size, aVertex.pos))
            intersection = True
            if localTouchPos[0] < aVertex.pos[0]:
                intersection = False
            elif localTouchPos[0] > aVertex.pos[0] + aVertex.size[0]:
                intersection = False
            if localTouchPos[1] < aVertex.pos[1]:
                intersection = False
            elif localTouchPos[1] > aVertex.pos[1] + aVertex.size[1]:
                intersection = False
        print('intersection =', intersection)
        return True

    return super(Actor, self).on_touch_down(touch)

Вы можете сделать нечто подобное для Line, но это может быть немного сложнее, если вы хотите сделать общее Line. Если ваш Line всегда вертикальный, он должен быть очень похожим.

...