簡體   English   中英

Kivy如何旋轉圖片

[英]Kivy how to rotate a picture

我正在嘗試旋轉一些我必須在屏幕上顯示的圖片,這些圖片在stacklayout內,我需要將它們顯示為Portrait而不是landscape,我正在使用Image Widget Thanks

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是用於此目的。 但我想這是一個更直觀的解決方案。 Scatter包括旋轉(以及縮放)屬性。

基本上,我將Image嵌入Scatter中並使用rotation屬性旋轉90度。

為什么我說Scatter不適用於此任務。 基本上是因為它允許手勢。 您可以用手指進行平移,旋轉或縮放(或使用多點觸控鼠標仿真 )。 這就是為什么在下一個例子中我將do_scaledo_rotationdo_translation為false。 在你混淆do_rotation: 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()

我認為他們有兩種方法可以做到這一點。 我將發布兩個答案,讓其他人決定什么是正確的方法。 我個人更喜歡這種方法,因為我認為它的計算更輕。 但是,它並不直觀

此方法使用RelativeLayout和兩個上下文指令(Rotate and Translate)。

1 - 您需要將Image嵌入RelativeLayout中 為什么? 因為Rotate的工作方式類似於在(0,0)坐標(即左下角)放置釘子。 RelativeLayout將0,0設置為Widget的位置。

2-您需要使用畫布

3-正如我之前所說,旋轉指令相當於在(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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM