function scale_text_delta(template, delta) template = template.slide for i = 1, #template do local paint = template[i].paint paint:setTextSize(paint:getTextSize() + delta) end end function slide_transition(prev, next, is_forward) local rec = { proc = function(self, canvas, drawSlideProc) if self:isDone() then drawSlideProc(canvas) return nil end self.prevDrawable:draw(canvas, self.curr_x, 0) self.nextDrawable:draw(canvas, self.curr_x + 640, 0) self.curr_x = self.curr_x + self.step_x return self end } if is_forward then rec.prevDrawable = prev rec.nextDrawable = next rec.curr_x = 0 rec.step_x = -15 rec.isDone = function (self) return self.curr_x <= -640 end else rec.prevDrawable = next rec.nextDrawable = prev rec.curr_x = -640 rec.step_x = 15 rec.isDone = function (self) return self.curr_x >= 0 end end return rec end function sqr(value) return value * value end function set_blur(paint, alpha) local sigma = sqr(1 - alpha) * 20 if gUseBlurInTransitions then paint:setImageFilter(Sk.newBlurImageFilter(sigma, sigma)) end paint:setAlpha(alpha) end function fade_slide_transition(prev, next, is_forward) local rec = { paint = Sk.newPaint(), prevDrawable = prev, nextDrawable = next, proc = function(self, canvas, drawSlideProc) if self:isDone() then drawSlideProc(canvas) return nil end set_blur(self.paint, self.prev_a) self.prevDrawable:draw(canvas, self.prev_x, 0, self.paint) set_blur(self.paint, self.next_a) self.nextDrawable:draw(canvas, self.next_x, 0, self.paint) self:step() return self end } if is_forward then rec.prev_x = 0 rec.prev_a = 1 rec.next_x = 640 rec.next_a = 0 rec.isDone = function (self) return self.next_x <= 0 end rec.step = function (self) self.next_x = self.next_x - 20 self.next_a = (640 - self.next_x) / 640 self.prev_a = 1 - self.next_a end else rec.prev_x = 0 rec.prev_a = 1 rec.next_x = 0 rec.next_a = 0 rec.isDone = function (self) return self.prev_x >= 640 end rec.step = function (self) self.prev_x = self.prev_x + 20 self.prev_a = (640 - self.prev_x) / 640 self.next_a = 1 - self.prev_a end end return rec end function fade_transition(prev, next, is_forward) local rec = { paint = Sk.newPaint(), prevDrawable = prev, nextDrawable = next, proc = function(self, canvas, drawSlideProc) if self:isDone() then drawSlideProc(canvas) return nil end set_blur(self.paint, self.prev_a) self.prevDrawable:draw(canvas, 0, 0, self.paint) set_blur(self.paint, self.next_a) self.nextDrawable:draw(canvas, 0, 0, self.paint) self:step() return self end } rec.prev_a = 1 rec.next_a = 0 rec.isDone = function (self) return self.next_a >= 1 end rec.step = function (self) self.prev_a = math.max(self.prev_a - 0.025, 0) self.next_a = 1 - self.prev_a end return rec end function rotate_transition(prev, next, is_forward) local rec = { angle = 0, prevDrawable = prev, nextDrawable = next, activeDrawable = prev, proc = function(self, canvas, drawSlideProc) if self:isDone() then drawSlideProc(canvas) return nil end canvas:save() canvas:translate(320, 240) canvas:rotate(self.angle) canvas:translate(-320, -240) self.activeDrawable:draw(canvas, 0, 0) self:step() return self end, isDone = function (self) return self.angle >= 360 or self.angle <= -360 end } if is_forward then rec.step = function (self) self.angle = self.angle + 10 if self.angle >= 180 then self.activeDrawable = self.nextDrawable end end else rec.step = function (self) self.angle = self.angle - 10 if self.angle <= -180 then self.activeDrawable = self.nextDrawable end end end return rec end function zoom_transition(prev, next, is_forward) local rec = { scale = 1, scale_delta = .95, scale_limit = 0.2, pivot_x = 320, pivot_y = 240, prevDrawable = prev, nextDrawable = next, activeDrawable = prev, proc = function(self, canvas, drawSlideProc) if self:isDone() then drawSlideProc(canvas) return nil end canvas:translate(self.pivot_x, self.pivot_y) canvas:scale(self.scale, self.scale) canvas:translate(-self.pivot_x, -self.pivot_y) self.activeDrawable:draw(canvas, 0, 0) self:step() return self end, isDone = function (self) return self.scale > 1 end, step = function (self) if self.scale < self.scale_limit then self.scale = self.scale_limit self.scale_delta = 1 / self.scale_delta self.activeDrawable = self.nextDrawable end self.scale = self.scale * self.scale_delta end } return rec end gTransitionTable = { fade = fade_transition, slide = slide_transition, fade_slide = fade_slide_transition, rotate = rotate_transition, zoom = zoom_transition, }