At heart all if it is a display group with a collection of bitmaps, which are by default arranged in a line or multiple lines, you can left, centre and right justify them. This is their 'normal' state and to the system that is what they are. So if you animate them the anchor points don't move (as opposed to if you use transition.to on it)
The animation is driven by the concept of modifiers. For each displayed character you can change specific features - position offset, scale and rotation, alpha pretty much to anything you like. The 'modifier' receives a table saying which character, word, line etc. it is on and the modifiers work out what to do. So if you want your third word to be twice as big your modifier would have something like.
if info.wordIndex == 3 then modifier.xScale = 2, modifier.yScale = 2 end
Something like the wobble modifier just sticks a few small random numbers in the modifier.
Animation is basically a time adjusted modifier. There are two values used for this, an elapsed time since the string was created, and a 'position' function which is a percentage of width when static, but when modified this moves along.
If you don't animate the text but just shape it, the modifier is applied once and then nothing else happens, so there are no performance issues other than the time Corona takes to render the font bitmaps.
If you animate it, then at a given rate (you can change this) the bitmaps are continually re-modified, so you can then use the time features to make it move. This obviously has resource implications, because everything is repositioned and recalculated. If it was (say) used in an arcade game for the score it would be fine static - to the system it's just more bitmap images - but animated might slow things down to much especially on low end Android hardware.
In general though it's fine. I've got an ultra cheapie 7" tablet - the worst I could find - and it seems to cope fine.
So the roll out modifier is something like:
if info.elapsedTime/1000 > info.index then modifier.alpha = 1 else modifier.alpha = 0 end
So every one second, the elapsed time reveals one more character (index is the character number it is enquiring about) after 1 second, index 1 is shown, after 2 seconds 1 and 2, after 3 seconds 1,2, and 3 etc. Modifiers can be functions (simpler) or classes (useful where you have state - e.g. the main_roll.lua file has a speed state).
You don't have to use modifiers, you can just write things like:
b = display.newBitmapString("Hello world",160,240,"retroFont",42):setModifier("curve"):animate()
and it will create the string, and curve it and animate that curve. The built in named effects are just a few modifiers I've written, most of them are a couple of lines of code.
Note, this chaining approach is a shorthand for:
b = display.newBitmapString("Hello world",160,240,"retroFont",42)
There is one down side, which I haven't come up with an answer to yet. You can treat it exactly as a display.newGroup() object - it is one - except for the following problem:
If you animate a font, it adds an enterFrame listener so it can animate. This creates an external reference to the bitmap object, and I haven't figured out how to autoRemove this listener.
You can remove the bitmap string just with bitmap:removeSelf() and it tidies up after itself, you can turn the animation off with bitmap:stop() and same thing happens, but Composer/Storyboard's garbage collection doesn't seem to have a finaliser.
So if you do purge an animated string this way, it will still be there (non visible) because of the enterFrame reference.
If you turn the animation off in the exit phase of the Scene managers, or remove the string, it works fine. If you don't animate it it works fine, it's just like any other graphic.