Corona SDK中如何对文本(TextObject)应用图片效果?

How can image effects be applied to text (TextObject) in Corona SDK?

我想对我的 Corona SDK 应用程序中显示的文本应用模糊、擦除和遮罩等图像效果。如果要显示的文本是静态的,我可以将其存储在图像文件中。基于该图像的 DisplayObject 可以使用 display.newImage() 实例化,并通过设置对象的 fill 属性 应用效果。 (这在 Graphics/Audio/Animation 的 Corona 开发人员指南中的 section on image effects 中进行了解释。)

但是,每次用户启动应用程序时,我需要显示的文本都会发生变化。它基于从列表中随机选择的短语组合,并以取决于用户偏好的字体和字体大小显示。所以在这种情况下不能使用图像资产方法。

有没有办法将图像效果应用于使用 display.newText() 创建的 TextObject?这些对象没有fill属性,所以不清楚这些效果能不能用

TextObjects 确实没有 fill 属性,而且据我所知,没有办法直接对它们应用图像效果。我尝试了各种图像效果,甚至尝试了更简单的填充,如渐变。没有骰子。

不过,我意识到 TextObject(与所有 DisplayObject 一样)可以插入到 具有 fill 属性 的 SnapshotObject 的 GroupObject 中.来自图形开发指南的 Snapshots section

Snapshots inherit all functionality of rectangles. For example, all 2.5D effects are available to snapshot objects.

通过仅将 TextObject 插入快照并对后者应用图像效果,您可以有效地将效果应用到文本。

此代码片段演示了此解决方案。我正在实现的效果使最初隐藏的文本通过边缘模糊的圆形钥匙孔出现。 (过渡分三个阶段完成,以保留内外半径之间的模糊区域。)

local textString = "This is some string generated at Runtime."
local textObj = display.newText({
    text = textString,
    font = myFavoriteFont,
    fontSize = myFavoriteFontSize})
textObj:setFillColor( 0 )

local snapshot = display.newSnapshot( textObj.contentWidth, textObj.contentHeight )
snapshot.group:insert( textObj )

snapshot.fill.effect = "filter.vignetteMask"
snapshot.fill.effect.innerRadius = 0.01 
snapshot.fill.effect.outerRadius = 0 

sceneGroup:insert( snapshot )

local totalTimeForTextToAppear = 2000 -- duration of transition in milliseconds
local timeStep = totalTimeForTextToAppear / 3 -- duration of each phase of the transition
transition.to( snapshot.fill.effect, {delay = 0, time = timeStep , innerRadius=0.5})
transition.to( snapshot.fill.effect, {delay = timeStep, time = timeStep, innerRadius=1} )
transition.to( snapshot.fill.effect, {delay = timeStep, time = timeStep, outerRadius=.5} )
transition.to( snapshot.fill.effect, {delay = 2 * timeStep, time = timeStep, outerRadius=.99} )

(使用此方法时,所有关于 Android 设备上的快照的常见 "gotchas" 都适用。这些是 discussed here。)

这是我找到的问题的解决方案。我很乐意看到我可能错过的任何其他解决方法。