在解释我的问题之前,我会先介绍一下情境化。
我实现了一个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的宽度会变得非常大。这是一张图片,让您更好地理解:
我能想到的唯一解决方法是:
<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像素的高度
非常感谢您的关注,并为长篇文章感到抱歉。
答案 0 :(得分:0)
AsyncImage:
size_hint: None,None
size:self.image_ratio*root.height,root.height
source: root.image_url
mipmap: True