ScatterLayout - do_translation no funciona

Nov 03 2020

Mi código

import kivy
from kivy.uix.scatterlayout import ScatterLayout
from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button

class MyScatter(ScatterLayout):

    def __init__(self, *args, **kwargs):
        super(MyScatter, self).__init__(*args, **kwargs)
        self.img = Image(source='img.png', keep_ratio=True, center = self.center)
        self.add_widget(self.img)

class MainApp(App):
    def build(self):
        mainbox = FloatLayout()
        mainbox.add_widget(Button(text="Prev",
                                  font_size="17dp",
                                  size_hint=(.15, .15),
                                  pos_hint={"left":1,
                                            "center_y":0.5},
                                  ))
        ms = MyScatter(scale=1, pos_hint={"center_x":0.33, "center_y":0.5}, do_scale = True, do_rotation = False, do_translation = True)
        mainbox.add_widget(ms)
        return mainbox

root = MainApp()
root.run()

Las posiciones de botón e imagen son según mis necesidades. Pero, definí do_translation= Verdadero para MyScattery no funciona.

Respuestas

xralf Nov 03 2020 at 03:24

Me inspiré aquí y escribí este código:

import kivy
from kivy.uix.scatterlayout import ScatterLayout
from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button

class MyScatter(ScatterLayout):

    def __init__(self, *args, **kwargs):
        super(MyScatter, self).__init__(*args, **kwargs)
        self.img = Image(source='img.png', keep_ratio=True, pos_hint={"center_x":0.33, "center_y":0.5})
        self.add_widget(self.img)

    def on_touch_move(self, touch): #magic time!!!!
       res =  super(MyScatter, self).on_touch_move(touch)
       if res: #Yay do something!
           self.img.pos = (self.center_x, self.center_y)
       return res

class MainApp(App):
    def build(self):
        mainbox = FloatLayout()
        mainbox.add_widget(Button(text="Prev",
                                  font_size="17dp",
                                  size_hint=(.15, .15),
                                  pos_hint={"left":1,
                                            "center_y":0.5},
                                  ))
        ms = MyScatter(scale=1, do_scale = True, do_rotation = False, do_translation = True)
        mainbox.add_widget(ms)
        return mainbox

root = MainApp()

root.run()

Parece funcionar. Por favor, avíseme si es una buena solución.