2013-07-16 47 views
6

私は画面上に表示する必要がある写真を回転しようとしています。これらの写真はスタックレイアウトの中にあり、風景の代わりに肖像画として表示する必要があります。ウィジェット ありがとうKivy写真を回転する方法

答えて

14

と混同取得する前に、私はこれを明確にしていますが、私はむしろそれのための新しいウィジェットを作成し、それを使用します。

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原点プロパティの+1 –

+0

おかげで、後で試してみると、最高の解決策と思われます。あなたの助けに感謝します。私はまだフレームワークの仕組みについて何か不足しています。 – nukedbit

+0

常に重要ですオブジェクト指向にする。ありがとう。 – ehsan88

1

私はこれを行う方法は2つあると思います。私は2つの答えを掲示し、他者には正しいアプローチが何かを決定させます。私は個人的には、このメソッドを好む。しかし、それは直感的ではありません

このメソッドは、RelativeLayoutと2つのコンテキスト命令(回転と変換)を使用します。

1 - 画像をRelativeLayoutに埋め込む必要があります。どうして?回転の仕方は、(0,0)座標、つまり左下隅に釘を置くのと似ています。 RelativeLayoutは、0,0をウィジェットの位置に設定します。あなたは私が前に言ったようにcanvas

、3-を使用する必要があります

2-、ローテート命令は、座標(0,0)に釘を置くことと等価です。紙を考えてみてください。コーナーに釘を掛けると、回転は左に終わります。したがって、回転の前に、あなたはTranslateあなたの右に紙の部分をする必要があります。

4-今ではRotate RelativeLayoutと期待される位置で終了します。

RelativeLayoutを使用するもう1つの利点があります。それには、回転、スケーリング、または翻訳を広範囲に扱っている場合には、2つの重要な指示(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() 
4

私はScatterは、このための使用であることを意味するとは思いません。しかし、私はもっと直感的な解決策だと思います。 Scatterには、回転(およびスケール)プロパティが含まれています。

基本的には、ImageをScatterに埋め込み、rotationプロパティを使用して90度回転させました。

Scatterはこのタスクの対象ではありません。基本的にはジェスチャーを許すからです。基本的には、指で変換、回転、または拡大縮小することができます(または、multi-touch mouse emulationを使用)。そのため、次の例ではdo_scale,do_rotationおよびdo_translationをfalseに設定しています。あなたがtoto_ticoの前の2の回答を行うための方法です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() 
関連する問題