FP10のflash.text.engineで縦書きのテキストを試してみる。
FlashPlayer10で、文字組のエンジンがだいぶ向上したという話だったので早速ちょっと試してみた。
とりあえず縦書き。文章は青空文庫から拝借。
package { import flash.display.Sprite; import flash.text.engine.EastAsianJustifier; import flash.text.engine.ElementFormat; import flash.text.engine.FontDescription; import flash.text.engine.GlyphRotation; import flash.text.engine.LineJustification; import flash.text.engine.TextBlock; import flash.text.engine.TextElement; import flash.text.engine.TextLine; import flash.text.engine.TextRotation; public class VTextTest extends Sprite { public function VTextTest() { var str:String = ' 吾輩(わがはい)は猫である。' + '名前はまだ無い。' + "\n" + ' どこで生れたかとんと見当(けんとう)がつかぬ。' + '何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。' + '吾輩はここで始めて人間というものを見た。' + 'しかもあとで聞くとそれは書生という人間中で一番獰悪(どうあく)な種族であったそうだ。' + 'この書生というのは時々我々を捕(つかま)えて煮(に)て食うという話である。' + 'しかしその当時は何という考もなかったから別段恐しいとも思わなかった。' + 'ただ彼の掌(てのひら)に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。'; var font:FontDescription = new FontDescription("_sans", "normal", "normal", "device", "advanced"); var format:ElementFormat = new ElementFormat(font, 16, 0x333333,1); format.locale = "ja"; var textElem:TextElement = new TextElement(str, format); var textBlock:TextBlock = new TextBlock(textElem); textBlock.glyphRotation = GlyphRotation.FULL_AND_WIDE; textBlock.lineRotation = TextRotation.ROTATE_90; textBlock.textJustifier = new EastAsianJustifier("ja",LineJustification.UNJUSTIFIED); createLines(textBlock); } private function createLines(textBlock:TextBlock):void { var xPos:int = 400; var textLine:TextLine = textBlock.createTextLine (null, 400); while (textLine) { addChild(textLine); xPos -= textLine.textHeight+8; textLine.x = xPos; textLine.y = 20; textLine = textBlock.createTextLine(textLine, 400); } } } }
できたのがこれ。
わかったこと
- 低レベルAPIだけあって、パラメータもクラスもそこそこ多く、上のコードの通り数行のテキストを表示させるだけでも結構大変。このあたりはAdobeの上条さんのブログにマークアップ言語の話など出ているし、もう少し扱いやすくなりそうなので今後に期待。
- 縦書きはまだちょっと怪しい(括弧とか)か? それとも自分の指定のしかたが悪いのかな。
- 行の長さを色々いじってみた感じだと、禁則処理とかも結構ちゃんとやってくれてるっぽい。