2013-07-16 40 views
6

Tôi đang cố gắng xoay một số hình ảnh tôi phải hiển thị trên màn hình, những hình ảnh này nằm trong một chồng xếp chồng và tôi cần hiển thị chúng dưới dạng Chân dung thay vì phong cảnh, tôi đang sử dụng Hình ảnh Tiện ích Cảm ơnKivy cách xoay ảnh

Trả lời

14

2 câu trả lời trước của toto_tico là một cách để làm, nhưng tôi thà tạo một widget mới cho nó, và sử dụng nó:

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

Sau đó, sử dụng tiện ích con này làm tiện ích Hình ảnh khác, bạn chỉ có thuộc tính "góc" mà bạn có thể chơi cùng.

Lưu ý: phát hiện va chạm không được xử lý trên hình ảnh, ngoại trừ trong ví dụ phân tán. Scatter có thể tốn kém chỉ để xoay một cái gì đó, nhưng ít nhất là va chạm hoạt động.

+0

+1 cho thuộc tính gốc –

+0

Cảm ơn tôi sẽ thử sau, có vẻ như giải pháp tốt nhất, cảm ơn sự giúp đỡ của bạn, tôi khá mới với kivy tôi vẫn nhớ điều gì đó về cách hoạt động của khung công tác :) – nukedbit

+0

Điều quan trọng là luôn luôn để được hướng đối tượng. Cảm ơn. – ehsan88

1

Tôi nghĩ rằng đó là hai cách để thực hiện việc này. Tôi sẽ đăng hai câu trả lời và cho phép người khác quyết định cách tiếp cận đúng là gì. Cá nhân tôi thích phương pháp này vì tôi nghĩ nó nhẹ hơn tính toán. Tuy nhiên, không phải là trực quan

Phương pháp này sử dụng lệnh RelativeLayout và hai lệnh ngữ cảnh (Xoay và Dịch).

1 - Bạn cần nhúng Hình ảnh bên trong RelativeLayout. Tại sao? Bởi vì cách Xoay hoạt động tương tự như đặt một đinh ở tọa độ (0,0), tức là góc dưới cùng bên trái. Các RelativeLayout đặt 0,0 đến vị trí của Widget.

2- Bạn sẽ cần phải sử dụng canvas

3 Như tôi đã nói trước đây, các hướng dẫn Rotate là tương đương để đặt một móng tay trong (0,0) phối hợp. Hãy suy nghĩ về một mảnh giấy. Nếu bạn đặt một đinh ở góc thì vòng quay sẽ kết thúc ở bên trái. Vì vậy, trước khi quay, bạn cần phải Translate mảnh giấy bên phải của bạn.

4- Bây giờ bạn có thể Rotate RelativeLayout và Nó sẽ kết thúc ở vị trí bạn mong đợi.

Có một lợi thế khác khi sử dụng RelativeLayout. Nó đã bao gồm hai hướng dẫn quan trọng (PushMatrixPopMatrix) mà bạn phải hiểu nếu bạn đang làm việc rộng rãi với xoay, mở rộng hoặc dịch.

Dưới đây là một ví dụ mã:

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

Tôi không nghĩ rằng Scatter có nghĩa là để được sử dụng cho việc này. Nhưng tôi đoán là một giải pháp trực quan hơn. Scatter bao gồm một thuộc tính xoay (và cũng là một quy mô).

Về cơ bản, tôi đã nhúng Hình ảnh bên trong một Phân tán và sử dụng thuộc tính xoay để xoay 90 độ.

Tại sao tôi nói Scatter không có nghĩa là cho tác vụ này. Về cơ bản bởi vì nó cho phép cử chỉ trên nó. Về cơ bản, bạn có thể dịch, xoay hoặc chia tỷ lệ bằng ngón tay (hoặc sử dụng multi-touch mouse emulation). Đó là lý do tại sao trong ví dụ tiếp theo, tôi đang đặt do_scale, do_rotationdo_translation thành sai. Tôi đang làm rõ điều này trước khi bạn nhận được nhầm lẫn với các 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()