[英]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_scale
, do_rotation
和do_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還有另一個優點。 它已經包含兩個重要指令( 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.