我尝试从Scatter创建一个kivy小部件,它可以自由缩放,但是一旦鼠标按钮被抬起就会回落到最接近的缩放级别。
它可以工作,但在下次点击之前它不会更新缩放。我想我需要在这里绑定一些事件,但我对kivy很新,并且无法弄明白。这是我目前的代码:
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.scatter import Scatter
from kivy.graphics.transformation import Matrix
ZOOM_LEVELS = [0.25, 0.5, 1, 2, 4]
class PPMap(Scatter):
def __init__(self, **kwargs):
super(PPMap, self).__init__(**kwargs)
self.bind(on_touch_up=self.adjust_zoom)
def adjust_zoom(self, *args):
old_zoom = self.scale
new_zoom = min(ZOOM_LEVELS, key=lambda x:abs(x-old_zoom))
self.set_zoom(new_zoom)
def set_zoom(self, zoom):
self.transform.set(array=[[zoom, 0, 0, 0],
[0, zoom, 0, 0],
[0, 0, zoom, 0],
self.transform.tolist()[3]])
class PPApp(App):
def build(self):
pp_map = PPMap(do_rotation=False, scale_min=ZOOM_LEVELS[0], scale_max=ZOOM_LEVELS[-1])
label = Label(text="Hello!", font_size=300, pos=(0, 0))
pp_map.add_widget(label)
return pp_map
if __name__ == "__main__":
PPApp().run()
答案 0 :(得分:1)
看看这个方法https://kivy.org/docs/api-kivy.uix.scatter.html#kivy.uix.scatter.Scatter.apply_transform
您可以重写与{/ p>类似的set_zoom
def set_zoom(self, new_zoom, old_zoom):
zoom = new_zoom / old_zoom
self.apply_transform(Matrix().scale(zoom, zoom, zoom))
如果你除以old_zoom并乘以所需,你应该得到正确的 因为它似乎是倍增的缩放。
Here是另一个有用的链接,他们使用Scatter并针对桌面进行优化。
答案 1 :(得分:1)
self.transform.set( # ...
问题在于您修改了现有的ObjectProperty实例,而Kivy并不知道它已更改:
警告要将属性标记为已更改,您必须重新分配新属性 python对象。
您可以这样做,或者,例如,手动发送:
def set_zoom(self, zoom):
self.transform.set(array=[[zoom, 0, 0, 0],
[0, zoom, 0, 0],
[0, 0, zoom, 0],
self.transform.tolist()[3]])
self.property('transform').dispatch(self) # transform has changed