9

我正在尝试旋转一些我必须在屏幕上显示的图片,这些图片在堆栈布局内,我需要将它们显示为纵向而不是横向,我正在使用图像小部件谢谢

4

3 回答 3

16

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()

然后,将此小部件用作其他图像小部件,您只需拥有一个可以使用的“角度”属性。

注意:碰撞检测不在图像上处理,除了分散示例。Scatter 仅用于旋转某些东西可能很昂贵,但至少碰撞有效。

于 2013-07-17T12:35:44.187 回答
4

我不认为Scatter是用来做这个的。但我想是一个更直观的解决方案。Scatter 包括一个旋转(以及一个缩放)属性。

基本上,我将图像嵌入到 Scatter 中,并使用旋转属性旋转 90 度。

为什么我说Scatter不适用于此任务。基本上是因为它允许对其进行手势。您基本上可以用手指(或使用多点触控鼠标仿真)进行平移、旋转或缩放。这就是为什么在下一个示例中我将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()
于 2013-07-16T14:40:50.150 回答
1

我认为他们是这样做的两种方式。我将发布两个答案,让其他人决定什么是正确的方法。我个人更喜欢这种方法,因为我认为它的计算量更轻。然而,它并不那么直观

此方法使用一个 RelativeLayout 和两个上下文指令(Rotate 和 Translate)。

1 - 您需要将 Image 嵌入到RelativeLayout中。为什么?因为 Rotate 的工作方式类似于将钉子放在 (0,0) 坐标中,即左下角。RelativeLayout将0,0 设置为 Widget 的位置。

2-您将需要使用画布

3- 正如我之前所说,Rotate 指令相当于在 (0,0) 坐标中钉了一个钉子。想想一张纸。如果你把钉子放在角落里,旋转将在左边结束。所以,在旋转之前,你需要把这张纸翻译到你的右边。

4-现在您可以旋转RelativeLayout,它将在您期望的位置结束。

使用RelativeLayout 还有另一个优点。它已经包含了两个重要的指令(PushMatrixPopMatrix),如果您广泛使用旋转、缩放或平移,则必须了解这些指令。

这是一个示例代码:

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()
于 2013-07-16T14:30:54.463 回答