2024-05-08 06:24:09 发布
网友
我正在尝试旋转一些我必须在屏幕上显示的图片,这些图片在堆栈布局中,我需要将它们显示为纵向而不是横向,我正在使用图像小部件 谢谢
to to-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()
然后,将此小部件用作其他图像小部件,您只需拥有一个可以使用的“角度”属性。
注意:除了在散射示例中,碰撞检测不会在图像上处理。仅仅为了旋转一些东西,散射可能很昂贵,但至少碰撞是有效的。
我认为这是两种方式。我会发布两个答案,让其他人决定什么是正确的方法。我个人更喜欢这种方法,因为我认为它的计算量更轻。然而,这并不是那么直观
此方法使用一个RelativeLayout和两个上下文指令(Rotate和Translate)。
1-您需要将图像嵌入到RelativeLayout中。为什么?因为Rotate的工作方式类似于在(0,0)坐标系中放置钉子,即左下角。RelativeLayout将0,0设置为小部件的位置。
2-您需要使用canvas
3-如我之前所说,旋转指令相当于在(0,0)坐标中放置一个钉子。想想一张纸。如果你在拐角处钉一个钉子,旋转将在左边结束。所以,在旋转之前,你需要Translate右边的那张纸。
4-现在你可以Rotate相对论时间,它将以你期望的位置结束。
使用相对延迟还有一个优点。它已经包含了两个重要的指令(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()
我不认为Scatter是用来做这个的。但我想这是一个更直观的解决方案。散射包括旋转(以及缩放)属性。
基本上,我将图像嵌入到散点图中,并使用旋转属性旋转90度。
为什么我要说Scatter不是用于此任务的。基本上是因为它允许在上面做手势。你基本上可以用手指来平移、旋转或缩放(或者使用multi-touch mouse emulation)。这就是为什么在下一个示例中,我将do_scale、do_rotation和do_translation设置为false的原因。在你与do_rotation: false混淆之前,我要澄清这一点
do_scale
do_rotation
do_translation
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()
to to-tico前面的2个答案是一种方法,但是我宁愿为它创建一个新的小部件,并使用它:
然后,将此小部件用作其他图像小部件,您只需拥有一个可以使用的“角度”属性。
注意:除了在散射示例中,碰撞检测不会在图像上处理。仅仅为了旋转一些东西,散射可能很昂贵,但至少碰撞是有效的。
我认为这是两种方式。我会发布两个答案,让其他人决定什么是正确的方法。我个人更喜欢这种方法,因为我认为它的计算量更轻。然而,这并不是那么直观
此方法使用一个RelativeLayout和两个上下文指令(Rotate和Translate)。
1-您需要将图像嵌入到RelativeLayout中。为什么?因为Rotate的工作方式类似于在(0,0)坐标系中放置钉子,即左下角。RelativeLayout将0,0设置为小部件的位置。
2-您需要使用canvas
3-如我之前所说,旋转指令相当于在(0,0)坐标中放置一个钉子。想想一张纸。如果你在拐角处钉一个钉子,旋转将在左边结束。所以,在旋转之前,你需要Translate右边的那张纸。
4-现在你可以Rotate相对论时间,它将以你期望的位置结束。
使用相对延迟还有一个优点。它已经包含了两个重要的指令(PushMatrix和PopMatrix),如果您正在广泛地使用旋转、缩放或平移,则必须理解这两个指令。
下面是一个示例代码:
我不认为Scatter是用来做这个的。但我想这是一个更直观的解决方案。散射包括旋转(以及缩放)属性。
基本上,我将图像嵌入到散点图中,并使用旋转属性旋转90度。
为什么我要说Scatter不是用于此任务的。基本上是因为它允许在上面做手势。你基本上可以用手指来平移、旋转或缩放(或者使用multi-touch mouse emulation)。这就是为什么在下一个示例中,我将
do_scale
、do_rotation
和do_translation
设置为false的原因。在你与do_rotation: false
混淆之前,我要澄清这一点相关问题 更多 >
编程相关推荐