我正在尝试旋转一些我必须在屏幕上显示的图片,这些图片在stacklayout内,我需要将它们显示为Portrait而不是landscape,我正在使用Image Widget 感谢
答案 0 :(得分:14)
toto_tico之前的2个答案是一种方法,但我宁愿为它创建一个新的小部件,并使用它:
Builder.load_string('''
<RotatedImage>:
canvas.before:
PushMatrix
Rotate:
angle: root.angle
axis: 0, 0, 1
origin: root.center
canvas.after:
PopMatrix
''')
class RotatedImage(Image):
angle = NumericProperty()
然后,使用此小部件作为其他图像小部件,您只需要一个“角度”属性即可。
注意:除散点示例外,图像上不处理碰撞检测。对于旋转物体来说,散射可能很昂贵,但至少碰撞是有效的。
答案 1 :(得分:4)
我认为Scatter不适用于此。但我想这是一个更直观的解决方案。 Scatter包括旋转(以及缩放)属性。
基本上,我将Image嵌入Scatter中并使用rotation属性旋转90度。
为什么我说Scatter不适用于此任务。基本上是因为它允许手势。您基本上可以用手指翻转,旋转或缩放(或使用multi-touch mouse emulation)。这就是为什么在下一个示例中,我将do_scale
,do_rotation
和do_translation
设置为false。在您与do_rotation: false
from kivy.app import App
from kivy.uix.stacklayout import StackLayout
from kivy.lang import Builder
Builder.load_string("""
<Example>:
Image:
source: 'kivy.png'
size_hint: None,None
size: 64,64
Scatter:
pos: 0,0
size_hint: None,None
size: 64,64
do_rotation: False
do_scale: False
do_translation: False
rotation: 90
Image:
source: 'kivy.png'
size_hint: None,None
size: 64,64
""")
class Example(App, StackLayout):
def build(self):
return self
if __name__ == "__main__":
Example().run()
答案 2 :(得分:1)
我认为他们有两种方法可以做到这一点。我将发布两个答案,让其他人决定什么是正确的方法。我个人更喜欢这种方法,因为我认为它的计算更轻。但是,它不是那么直观
此方法使用RelativeLayout和两个上下文指令(Rotate and Translate)。
1 - 您需要将图像嵌入RelativeLayout内。为什么?因为Rotate的工作方式类似于在(0,0)坐标(即左下角)放置钉子。 RelativeLayout将0,0设置为Widget的位置。
2-您需要使用canvas
3-正如我之前所说,旋转指令相当于在(0,0)坐标中放置钉子。想想一张纸。如果你在角落里钉一个钉子,旋转就会在左边结束。因此,在轮换之前,您需要Translate右边的那张纸。
4-现在你可以Rotate RelativeLayout,它将以你期望的位置结束。
使用RelativeLayout还有另一个优点。它已包含两条重要说明(PushMatrix和PopMatrix),如果您正在广泛使用旋转,缩放或翻译,则必须了解这些说明。
以下是一个示例代码:
from kivy.app import App
from kivy.uix.stacklayout import StackLayout
from kivy.lang import Builder
Builder.load_string("""
<Example>:
Image:
source: 'kivy.png'
size_hint: None,None
size: 64,64
RelativeLayout
size_hint: None,None
size: 64,64
canvas.before:
Translate:
x: 64
Rotate:
angle: 90
axis: 0,0,1
Image:
source: 'kivy.png'
size_hint: None,None
size: 64,64
""")
class Example(App, StackLayout):
def build(self):
return self
if __name__ == "__main__":
Example().run()