Нарисовать теневую границу в modalView с помощью инструкции kivy Vertex?

#python-3.x #kivy #trigonometry #kivy-language #vertex

#python-3.x #kivy #тригонометрия #kivy-язык #вершина

Вопрос:

Я пытаюсь нарисовать тень для a ModalView , используя Canvas Line инструкции по вершинам. Т.е. ModalView Нижняя и левая стороны должны иметь небольшое теневое наложение при открытии. Я пытался вызвать ModalView свойство overlay_color без эффекта, а Canvas Line инструкции по вершинам не создают нужного эффекта. Но, похоже, я не могу нарисовать только нижнюю и левую границу, которая дает эффект тени.

 <PopScrollModal>
    on_open: app.root._is_modal_open = True
    on_dismiss: app.root._is_modal_open = False
    id: popscroll
    auto_dismiss: True
    orientation: 'vertical'
    size_hint: (0.94, 0.41)
    border: [50, 50, 16, 16]
    overlay_color: [0.1, 0.1, 0.1, 0.4]
    pos_hint: {'top': 0.72}
    background_normal: ''
    background_color: (1, 1, 1, 0)
    background: 'white.png'
    canvas:
        Color:
            rgba: app.theme_cls.bg_dark
        RoundedRectangle:
            size: self.size
            pos: self.pos
            radius: [7,]
    canvas.after:
        Color:
            rgba: (0.2, 0.2, 0.2, 0.4)
        Line:
            width: 1.
            rounded_rectangle: (self.x, self.y, self.width, self.height, 7)
    RecycleView:
        id: view_popscroll
        viewclass: 'PopScrollBut'
        pos_hint: {'top': 1}
        size_hint: [1, 0.99]
        do_scroll_y: True
        RecycleGridLayout:
            cols: 1
            spacing: 1
            default_size: None, 70
            default_size_hint: 1, None
            size_hint: 1, None
            size: self.minimum_size
  

Эта линейная инструкция рисует снизу, но не придерживается радиуса холста:

 canvas.after:
        Color:
            rgba: (0.2, 0.2, 0.2, 0.4)
        Line:
            width: 1.
            close: False
            points: self.pos[0], self.pos[1], self.pos[0]   self.size[0], self.pos[1]]
  

Line Инструкция рисует только линию вокруг ModalView .
Может кто-нибудь помочь понять, как установить Points , чтобы они отображались только слева и снизу, или установить overlay_color таким же образом?

Ответ №1:

Вы можете сделать это с помощью BorderImage . Это плохо документировано, и трудно понять, как оно на самом деле предназначено для работы. Но вот пример, который в основном делает то, что вы хотите:

 class MyPop(Popup):
    pass

kv = '''
<MyPop>:
    canvas.before:
        BorderImage:
            source: 'shadow32.png'
            border: 30, 0, 0, 30
            pos: self.x - 30, self.y - 30
            size: self.width   60, self.height   60
'''
  

И вот shadow32.png то, что используется выше:

введите описание изображения здесь

Комментарии:

1. Невероятно! Здесь я полировал свои книги по тригонометрии, чтобы понять Points свойство, и еще раз @John Anderson вы делаете усложнение таким простым. Спасибо… снова!