使用 kivy 顶点指令在 ModalView 上绘制阴影边框?

Draw a shadow border on ModalView with kivy Vertex Instruction?

我正在尝试使用 Canvas Line 顶点指令为 ModalView 绘制阴影。 IE。 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的半径:

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 吗?

您可以使用 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