2013-07-16 19 views
6

Ich versuche, einige Bilder zu drehen, die ich auf dem Bildschirm zeigen muss, diese Bilder sind in einem Stapellayout, und ich muss sie als Portrait statt Landschaft zeigen, ich benutze das Bild Widget DankeKivy, wie man ein Bild dreht

Antwort

14

Die vorherige 2 Antwort von toto_tico eine Art und Weise zu tun bekommen verwirren, aber ich würde lieber ein neues Widget für sie erstellen und verwenden es:

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

Dann verwenden Sie dieses Widget als andere Bild Widget, Sie haben nur eine "Winkel" -Eigenschaft, mit der Sie spielen können.

Hinweis: Die Kollisionserkennung wird im Bild nicht behandelt, außer im Streuungsbeispiel. Scatter kann teuer sein, nur um etwas zu drehen, aber zumindest funktioniert die Kollision.

+0

+1 für die Herkunft Eigenschaft –

+0

Danke ich werde es später versuchen, es scheint die beste Lösung, danke für Ihre Hilfe, ich bin ziemlich neu zu kivy Ich vermisse immer noch etwas auf, wie das Framework funktioniert :) – nukedbit

+0

Es ist immer wichtig objektorientiert sein. Vielen Dank. – ehsan88

1

Ich denke, sie sind zwei Möglichkeiten, dies zu tun. Ich werde zwei Antworten veröffentlichen und andere entscheiden lassen, was der richtige Ansatz ist. Ich persönlich bevorzuge diese Methode, weil ich denke, dass es leichter ist. Es ist jedoch nicht so intuitiv

Diese Methode verwendet eine RelativeLayout und zwei Kontextanweisungen (Drehen und Übersetzen).

1 - Sie müssen das Bild in die RelativeLayout einbetten. Warum? Weil die Art, wie Rotate funktioniert, ähnlich ist, einen Nagel in die (0,0) -Koordinate zu setzen, d. H. Die untere linke Ecke. Die RelativeLayout setzt die 0,0 auf die Position des Widgets.

2- Sie müssen die canvas

3- Wie gesagt verwenden, ist die Drehanweisung äquivalent einen Nagel in den (0,0) setzen koordinieren. Denk an ein Stück Papier. Wenn Sie einen Nagel in die Ecke legen, endet die Drehung auf der linken Seite. Also, vor der Rotation, müssen Sie Translate das Stück Papier auf der rechten Seite.

4- Jetzt können Sie das RelativeLayout Rotate und es wird in der Position enden, die Sie erwarten.

Es gibt einen weiteren Vorteil der Verwendung eines RelativeLayout. Es enthält bereits zwei wichtige Anweisungen (PushMatrix und PopMatrix), die Sie verstehen müssen, wenn Sie intensiv mit Drehen, Skalieren oder Übersetzen arbeiten. Hier

ist ein Beispielcode:

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

Ich glaube nicht die Scatter gemeint Verwendung dafür sein. Aber ich denke, es ist eine intuitivere Lösung. Der Streubereich enthält eine Rotationseigenschaft (und auch eine Skalierungseigenschaft).

Grundsätzlich habe ich das Bild in einem Scatter eingebettet und verwenden Sie die Rotationseigenschaft, um 90 Grad zu drehen.

Warum sage ich die Scatter ist nicht für diese Aufgabe gedacht. Grundsätzlich, weil es Gesten darüber erlaubt. Sie können grundsätzlich mit Ihren Fingern übersetzen, drehen oder skalieren (oder die multi-touch mouse emulation verwenden). Deshalb setze ich im nächsten Beispiel die Werte do_scale, do_rotation und do_translation auf false. Ich Klärung dieses, bevor Sie mit dem 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() 
Verwandte Themen