过渡

本指南讨论如何使用 Corona transition 库在特定时间段内移动、旋转、淡入淡出或缩放显示对象/组。

库功能

基本过渡

可以使用以下函数之一启动基本过渡

任一函数中的第一个参数 target 都是您希望进行过渡的显示对象或组。第二个参数 params 是一个键值对表。在此表中,为过渡指定适当的控制参数

控制 描述
time 指定过渡的持续时间(以毫秒为单位)。
delay 指定过渡开始前的延迟时间(以毫秒为单位)。默认为 0(无)。
delta 指定最终对象属性是特定值还是值的更改。默认为 nil,表示 false
iterations 过渡应重复的次数(整数)。0-1 将导致过渡永远重复。
tag 字符串值,允许您对过渡进行分类并一起控制它们。请参阅 控制过渡
transition 指定用于过渡的 缓动 函数。请参阅 缓动函数

要影响最终对象属性,可以使用以下方法。在 params 表中,指定每个适当的 属性 及其最终值。

方法 属性(键) 描述
move x, y 将对象从其当前的 x/y 坐标移动到另一个坐标。
rotate rotation 将对象从其当前角度旋转到另一个角度。
fade alpha 将对象的 alpha 值从当前值淡入淡出到另一个值。
scale xScale, yScale 将对象缩放到特定的 x 比例或 y 比例。
字体大小 size 仅当目标是 TextObject 时适用。这将过渡文本对象的字体大小。
resize width, height 将对象从其当前宽度/高度调整为另一个宽度/高度。
distort x1, y1, x2, y2, x3, y3, x4, y4 仅当目标是 RectPath 时适用,适用于 ShapeObject。这些属性控制目标的四边形变形。
填充效果 (各种) 仅当目标是应用于 ShapeObjectfill.effect 时适用。在这种情况下,属性(键)表示与特定滤镜效果关联的效果属性,例如 ShapeObject.fill.effect.intensity。有关哪些滤镜参数适用于每个滤镜,请参阅效果指南

请注意,过渡支持下面列出的所有过渡事件。当过渡上发生该事件时,这些标志将触发指定的侦听器函数。调用时,对象引用作为唯一参数传递给侦听器函数。有关详细信息,请参阅 过渡事件

事件 描述
onStart 过渡开始时调用的侦听器函数。
onComplete 过渡完成后调用的侦听器函数。
onPause 暂停活动过渡时调用的侦听器函数。
onResume 恢复暂停的过渡时调用的侦听器函数。
onCancel 取消活动过渡时调用的侦听器函数。
onRepeat 活动过渡完成迭代周期时调用的侦听器函数。

示例

  1. 以下过渡将对象从其当前位置移动到 2000 毫秒内 y 坐标为 100 的位置。在这种情况下,y 值是内容区域坐标中的特定值。
transition.to( myObject, { time=2000, y=100 } )
  1. 要将属性值应用为相对于对象起始值的更改,只需将 delta 属性设置为 true。在以下示例中,对象将从其起始 y 位置向下移动 100 像素。请注意,相同的原则可以应用于任何属性更改。
transition.to( myObject, { time=2000, y=100, delta=true } )
  1. 下一个过渡将对象从其当前位置移动到 2000 毫秒内 y 坐标为 400 的位置。它使用 iterations 参数重复 4 次,并使用 transition 参数应用弹性插值效果。
transition.to( myObject, { time=2000, y=400, iterations=4, transition=easing.outElastic } )
  1. 过渡也可以使用一个过渡调用组合。例如,如果要将对象旋转 45 度,将其垂直缩放至 200%,并将其 alpha 淡化至 50%,则无需进行三次单独的过渡调用。相反,只需在 params 表中声明所有三个属性更改
transition.to( myObject, { time=2000, rotation=45, yScale=2, alpha=0.5 } ) 
重要

某些对象在过渡期间或之后的行为可能与您的预期不符。例如,许多 widget 不支持缩放或后声明调整大小,因此您不应尝试对其执行 xScaleyScalewidthheight 过渡。另一个示例是 physics 物体:如果您使用过渡缩放或调整物理对象的大小,则实际的物理物体将不会随着该过渡一起缩放。

如有疑问,请查看与对象或库关联的 文档,以确认它没有任何与过渡相关的属性限制。

控制过渡

过渡可以在完成前暂停、恢复或取消。传递给控制函数的参数决定了操作的范围。

暂停

可以使用 transition.pause()transition.pauseAll() 函数暂停过渡。这些函数仅影响正在运行的过渡。

使用 transition.pause() 函数,您可以通过使用的参数来控制要暂停的特定过渡。

参数 范围
(无) 暂停所有正在运行的过渡。
过渡引用 暂停特定的正在运行的过渡。
对象引用 暂停特定对象上所有正在运行的过渡。
标签名称(字符串) 暂停共享同一标签名称的所有正在运行的过渡。

恢复

可以使用 transition.resume()transition.resumeAll() 函数恢复过渡。这些函数仅影响已暂停的过渡。

使用 transition.resume() 函数,您可以通过使用的参数来控制要恢复的特定过渡。

参数 范围
(无) 恢复所有暂停的过渡。
过渡引用 恢复特定的暂停过渡。
对象引用 恢复特定对象上所有暂停的过渡。
标签名称(字符串) 恢复共享同一标签名称的所有暂停过渡。

取消

可以使用 transition.cancel()transition.cancelAll() 函数取消过渡。请注意,过渡将停止在原地 - 它们不会恢复到其起始状态或跳到结束状态。这些函数仅影响当前正在运行或暂停的过渡。

使用 transition.cancel() 函数,您可以通过使用的参数来控制要取消的特定过渡。

参数 范围
(无) 取消所有正在运行/暂停的过渡。
过渡引用 取消特定的正在运行/暂停的过渡。
对象引用 取消特定对象上所有正在运行/暂停的过渡。
标签名称(字符串) 取消共享同一标签名称的所有正在运行/暂停的过渡。
重要

如果您在显示对象已被移除后意外地将对其的引用传递给 transition.pause()transition.resume()transition.cancel(),则该参数将为 nil。这与不向函数传递任何参数相同,这将导致所有过渡被暂停、恢复或取消(取决于函数)。

为了避免此默认行为,您可以在引用过渡库后在项目中包含以下代码行

transition.ignoreEmptyReference = true

如果将 transition.ignoreEmptyReference 设置为 true(默认为 false),则将 nil 或不向这三个函数传递任何参数将被忽略,并且不会发生任何事情。您可以随时使用 transition.pauseAll()transition.resumeAll()transition.cancelAll() 来控制所有过渡。

缓动函数

默认情况下,过渡以从起始值到结束值的恒定线性变化率发生。但是,您可能希望使用 缓动 效果来实现不同的结果,例如,使对象在开始时快速移动,并在到达目的地时逐渐减速。可以使用 缓动库 函数结合过渡调用来实现此行为。

要在过渡上设置缓动效果,只需在 params 表中提供 transition 键,其值等于 缓动库 函数之一

--transition the object out with quadratic interpolation
transition.to( myObject, { time=2000, y=100, transition=easing.outQuad } )

--transition the object in, then back out, with exponential interpolation
transition.to( myObject, { time=2000, y=100, transition=easing.inOutExpo } )

过渡事件

Corona 支持全方位的过渡事件,包括

要从过渡触发事件响应,请将所需的事件键添加到 params 表中,以及应调用的侦听器函数。

local myObject = display.newRect( 0, 0, 100, 100 )

local function completeListener ( obj )
    --when this function is invoked, the object reference is passed instead of an 'event' table
    print( "Transition completed on object: " .. tostring( obj ) )
end

transition.to( myObject, { time=2000, alpha=0, onComplete=completeListener } )
重要

如果您从内存中移除或清除正在过渡的对象,并且过渡具有 onComplete 事件,即使该对象不再存在于屏幕上,侦听器仍然会被调用。如果对象已被过早移除,其他过渡事件甚至可能会导致程序崩溃。因此,在移除特定对象之前取消其所有过渡是一个好习惯。为此,将对象引用传递给 transition.cancel() 非常有用。

在更广泛的范围内,您可以考虑在退出 Composer 场景或清除模块之前,使用不带参数的 transition.cancel() 来取消**所有**过渡。

便捷函数

Corona 提供了一些便捷函数,让您可以使用易于识别的名称执行简单的过渡。以下函数接受要过渡的对象/组作为第一个参数,并且像标准过渡一样,接受一个包含与过渡类型相对应的键值的 params 表。

函数 描述
transition.blink() 在指定时间内反复使对象的 alpha 值在显示和隐藏之间切换。
transition.dissolve() 在两个显示对象之间执行溶解过渡。
transition.fadeIn() 在指定时间内将对象的 alpha 值淡入到 1.0。
transition.fadeOut() 在指定时间内将对象的 alpha 值淡出到 0.0。
transition.moveBy() 在指定时间内将对象按指定的 x 和 y 坐标量移动。
transition.moveTo() 在指定时间内将对象移动到指定的 x 和 y 坐标。
transition.scaleBy() 在指定时间内将对象按指定的 xScale 和 yScale 量进行缩放。
transition.scaleTo() 在指定时间内将对象缩放到指定的 xScale 和 yScale 量。