2013-07-16 8 views
6

Я пытаюсь повернуть некоторые фотографии, которые я должен показать на экране, эти изображения находятся внутри stacklayout, и мне нужно показать их как Portrait вместо пейзажа, я использую Image Виджет СпасибоKivy как повернуть картинку

ответ

14

предыдущий 2 ответ toto_tico это способ сделать, но я предпочел бы создать новый виджет для него, и использовать его:

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

Затем, используйте этот виджет как другой виджет изображения, у вас есть свойство «angle», с которым вы можете играть.

Примечание: обнаружение столкновения не обрабатывается на изображении, за исключением примера рассеяния. Рассеяние может быть дорогостоящим только для вращения чего-то, но, по крайней мере, столкновение работает.

+0

+1 для свойства начала –

+0

Спасибо, я попробую позже, это будет лучшее решение, спасибо за вашу помощь, я совершенно новичок в kivy, я все еще скучаю по тому, как работает рама :) – nukedbit

+0

Важно всегда быть объектно-ориентированным. Благодарю. – ehsan88

1

Я думаю, что это два способа сделать это. Я отправлю два ответа и позволю другим решить, какой подход правильный. Я лично предпочитаю этот метод, потому что я думаю, что он легче вычислить. Однако это не так, интуитивно.

Этот метод использует RelativeLayout и две контекстные инструкции (Поворот и Перевод).

1 - Вам необходимо встроить изображение внутри RelativeLayout. Зачем? Поскольку работа Rotate похожа на установку гвоздя в координате (0,0), то есть в нижнем левом углу. RelativeLayout устанавливает 0,0 в положение виджета.

2- Вам нужно будет использовать canvas

3- Как я уже говорил, команда Rotate эквивалентно положить гвоздь в (0,0) координаты. Подумайте о листе бумаги. Если вы положите гвоздь в угол, вращение закончится слева. Итак, перед вращением вам нужно сделать Translate лист бумаги справа от вас.

4 Теперь вы можете Rotate 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() 
4

Я не думаю, что Scatter предназначается, чтобы быть использовать для этого. Но я думаю, это более интуитивное решение. Scatter включает свойство вращения (а также масштаб).

В принципе, я встроил изображение внутри Scatter и использовал свойство вращения для поворота на 90 градусов.

Почему я говорю, что Scatter не предназначен для этой задачи. В основном потому, что он позволяет жесты над ним. Вы можете в основном переводить, вращать или масштабировать пальцами (или используя multi-touch mouse emulation). Вот почему в следующем примере я устанавливаю do_scale, do_rotation и do_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() 
Смежные вопросы