So I need to create an interactive game map for other players. They could add some markers on it locally.
I imported the image of the map and saw a stackoverflow subject with someone having the same problem. I got the solution but it’s zooming at the center of the picture.
It’s a very large picture so i need to make the zoom possible on the cursor of the mouse.
Here’s the code I’ve already made :
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.scatterlayout import ScatterLayout from kivy.uix.scatter import Scatter from kivy.core.window import Window from kivy.graphics.transformation import Matrix from kivy.lang import Builder Builder.load_file('map.kv') class Zoom(ScatterLayout): def on_touch_down(self, touch): x, y = touch.x, touch.y self.prev_x = touch.x self.prev_y = touch.y if touch.is_mouse_scrolling: if touch.button == 'scrolldown': print('down') ## zoom in if self.scale < 10: self.scale = self.scale * 1.1 elif touch.button == 'scrollup': print('up') ## zoom out if self.scale > 1: self.scale = self.scale * 0.9 # if the touch isn't on the widget we do nothing if not self.do_collide_after_children: if not self.collide_point(x, y): return False if 'multitouch_sim' in touch.profile: touch.multitouch_sim = True # grab the touch so we get all it later move events for sure self._bring_to_front(touch) touch.grab(self) self._touches.append(touch) self._last_touch_pos[touch] = touch.pos return True class Main_app(BoxLayout): pass class Stacked(App): def build(self): Window.clearcolor = (1, 1, 1, 1) Window.size = (1000, 700)
Advertisement
Answer
Seems like that should be an option for Scatter
and ScatterPlane
, but it isn’t. Here is a hack I have used to accomplish what you asked about:
class MyScatterPlane(ScatterPlane): def on_touch_up(self, touch): if self.collide_point(*touch.pos): if touch.is_mouse_scrolling: if touch.button == 'scrolldown': mat = Matrix().scale(.9, .9, .9) self.apply_transform(mat, anchor=touch.pos) elif touch.button == 'scrollup': mat = Matrix().scale(1.1, 1.1, 1.1) self.apply_transform(mat, anchor=touch.pos) return super().on_touch_up(touch)
This is an extension of ScatterPlane
, but it is not extensively tested. Use at your own risk.