Kivy如何旋转图片

时间:2013-07-16 10:57:21

标签: python kivy

我正在尝试旋转一些我必须在屏幕上显示的图片,这些图片在stacklayout内,我需要将它们显示为Portrait而不是landscape,我正在使用Image Widget 感谢

3 个答案:

答案 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_scaledo_rotationdo_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还有另一个优点。它已包含两条重要说明(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()