diff --git a/kivy/uix/screenmanager.py b/kivy/uix/screenmanager.py index 65c6edce9..1643b8fc9 100644 --- a/kivy/uix/screenmanager.py +++ b/kivy/uix/screenmanager.py @@ -596,15 +596,34 @@ class SwapTransition(TransitionBase): '''Swap transition that looks like iOS transition when a new window appears on the screen. ''' + def __init__(self, **kwargs): + super(SwapTransition, self).__init__(**kwargs) + self.scales = {} + + def start(self, manager): + for screen in self.screen_in, self.screen_out: + with screen.canvas.before: + PushMatrix(group='swaptransition_scale') + scale = Scale(group='swaptransition_scale') + with screen.canvas.after: + PopMatrix(group='swaptransition_scale') + + screen.bind(center=self.update_scale) + self.scales[screen] = scale + super(SwapTransition, self).start(manager) + + def update_scale(self, screen, center): + self.scales[screen].origin = center def add_screen(self, screen): self.manager.real_add_widget(screen, 1) def on_complete(self): - self.screen_in.scale = 1. - self.screen_out.scale = 1. self.screen_in.pos = self.manager.pos self.screen_out.pos = self.manager.pos + for screen in self.screen_in, self.screen_out: + for canvas in screen.canvas.before, screen.canvas.after: + canvas.remove_group('swaptransition_scale') super(SwapTransition, self).on_complete() def on_progress(self, progression): @@ -612,8 +631,8 @@ class SwapTransition(TransitionBase): b = self.screen_out manager = self.manager - b.scale = 1. - progression * 0.7 - a.scale = 0.5 + progression * 0.5 + self.scales[b].xyz = [1. - progression * 0.7 for xyz in 'xyz'] + self.scales[a].xyz = [0.5 + progression * 0.5 for xyz in 'xyz'] a.center_y = b.center_y = manager.center_y al = AnimationTransition.in_out_sine