KIVY:AsyncImage小部件在RecycleView中调整大小问题

时间:2017-04-07 07:58:12

标签: python kivy kivy-language

在解释我的问题之前,我会先介绍一下情境化。

我实现了一个RecycleView小部件,其中包含一个RecycleBoxLayout,其default_size是动态的(基于其父级的大小)。我认为这是必要的(我可能错了),因为我的应用程序将用于各种各样的设备,我喜欢我的RV包含平均4个PlaylistItem。这里是.kv文件中的代码:

RecycleView:
    id: rv
    scroll_type: ['bars', 'content']
    scroll_wheel_distance: dp(114)
    viewclass: 'PlaylistItem'
    RecycleBoxLayout:
        default_size: None, (self.parent.height / 4 - dp(80)) if self.parent.height / 4 > dp(60) else dp(60)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'
        spacing: dp(20)
        padding: dp(20)

现在让我们来看看PlaylistItem视图类的代码:

<PlaylistItem@BoxLayout>:
    created_time: ''
    description: ''
    id: ''
    image_url: ''
    name: ''
    owner: ''
    updated_time: ''
    playlist_name: ''

    MDCard:
        AsyncImage:
            size_hint_x: .2
            size: self.texture_size
            source: root.image_url
            mipmap: True

        BoxLayout:
            orientation:'vertical'

            MDLabel:
                text: root.playlist_name
                theme_text_color: 'Secondary'
                font_style:'Title'     
            MDSeparator:
                height: dp(1)
            MDLabel:
                text: 'Body'
                theme_text_color: 'Primary'

因此,我希望保持AsyncImage小部件中图像的比例。我希望此图片的宽度占据其父窗口小部件的20%。最后,我希望AsyncImage的大小等于其图像的(纹理)大小。上面的代码根据窗口的大小来确定,图像的高度并不总是等于其父级的高度(结果不是很好)。当我尝试:

AsyncImage:
    size_hint_y: None
    height: self.parent.height
    source: root.image_url
    mipmap: True

图像的高度总是很好(等于MDCard高度),但AsyncImage的宽度会变得非常大。这是一张图片,让您更好地理解:

Kivy's AsyncImage widget resize issue

我能想到的唯一解决方法是:

<PlaylistItem@BoxLayout>:
    created_time: ''
    description: ''
    id: ''
    image_url: ''
    name: ''
    owner: ''
    updated_time: ''
    playlist_name: ''

    # I ADDED THIS # <----------------------------------
    size_hint_y: None
    miminum_height: self.minimum_height

    MDCard:
        AsyncImage:
            size_hint_x: .2
            size: self.texture_size
            source: root.image_url
            mipmap: True

这不起作用。我相信在初始化时纹理尚未加载,因此self.minimum_height为None。我不确定。希望有人可以提供帮助。

奖金细节:我确信我的所有原始图像都有480像素的高度

非常感谢您的关注,并为长篇文章感到抱歉。

1 个答案:

答案 0 :(得分:0)

#kivy IRC频道上的Atis找到了解决方案。一个人应该只使用image_ratio!:

AsyncImage:
    size_hint: None,None
    size:self.image_ratio*root.height,root.height
    source: root.image_url
    mipmap: True