2013-07-16 75 views
6

我想旋轉一些圖片我必須在屏幕上顯示,這些圖片是在一個stacklayout內,我需要顯示他們作爲肖像,而不是風景,我使用的圖像小工具 謝謝Kivy如何旋轉圖片

回答

14

混淆前2回答toto_tico的是一種方法做之前,但我寧願創建一個新的widget它,並使用它:

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

然後,使用這個小部件作爲其他圖像小部件,你只需要一個「角度」屬性,你可以玩。

注意:碰撞檢測不在圖像上進行處理,除了分散示例。爲了旋轉某些東西,分散可能很昂貴,但至少碰撞是可行的。

+0

+1原產地 –

+0

謝謝我以後再試,看來是最好的解決方法,感謝您的幫助,我對基維很新,我仍然錯過了框架的工作原理:) – nukedbit

+0

重要的是始終面向對象。謝謝。 – ehsan88

1

我認爲他們是這樣做的兩種方式。我會發布兩個答案,並讓其他人決定什麼是正確的方法。我個人更喜歡這種方法,因爲我認爲它的計算較輕。然而,這並不是那麼直觀的

該方法使用RelativeLayout和兩個上下文指令(旋轉和平移)。

1 - 您需要將圖像嵌入RelativeLayout。爲什麼?因爲旋轉工作的方式類似於在(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() 
4

我不認爲Scatter,就是要爲這種用途。但我想是一個更直觀的解決方案。散點包括一個旋轉(也是一個比例)屬性。

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

爲什麼我說Scatter不適合這項任務。基本上,因爲它允許手勢。基本上可以用手指翻譯,旋轉或縮放(或使用multi-touch mouse emulation)。這就是爲什麼在下一個示例中,我將do_scale,do_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()