2013年12月4日水曜日

[AS3]BreakOpportunity.ANYでTLF Markupの明示的な改行(
)が効かなくなる。

いつも直感的な動作をしてくれないAdobeのフレームワーク。
またひとつやらかしてくれました。

問題発生

コンテナに沿って一文字ずつ文字を表示したかったため、TextFlowをBreakOppotunity.ANYに設定していたのですが、TextConverter.importToFlow()で読み込んだTLF Markupの<br/>が効かないという事象が発生しました。
BreakOppotunity.AUTOに戻すと効きます。BreakOppotunity.AUTOにしておかないとたとえ<br/>タグ(内部的には改行コード)であろうと改行してくれないようです。

なお、発生した環境は MacOSX Flex4.6/Air3.1

解決策

TextConverter.importToFlow()は<br/>を見つけると<span>\u2028</span>という形式に変換するようです。直前までのspanを一度区切って、一個専用のspan要素を作ります。
そこで、importToFlow()が返したTextFlowの子要素を再帰的に辿り、<br/>から変換されたspan要素のbreakOppotunityだけをBreakOppotunity.AUTOに書き換えることで問題を解決することができました。

private function fixLineBreak(elem:FlowGroupElement):void {
 var num:int = elem.numChildren;
 for ( var i:int = 0; i < num; i++ ) {
  var child:FlowElement = elem.getChildAt(i);
  if ( child is SpanElement ) {
   var span:SpanElement = SpanElement(child);
   if ( span.text == "\u2028" ) {
    span.breakOpportunity = BreakOpportunity.AUTO;
   }
  }
  if ( child is FlowGroupElement ) {
   fixLineBreak(FlowGroupElement(child));
  }
 }
}


0 件のコメント:

コメントを投稿