2

表示リストに追加される前に、要素 (LinkElement など) の位置を検索しようとする TLF で問題が発生しました。

次のコードを試しました:

  1. 私の textFlow を作成します。

    var textFlow:TextFlow = TextConverter.importToFlow(MY_HTML_STRING,
    TextConverter.TEXT_FIELD_HTML_FORMAT);
    
  2. 必要なすべての要素を取得します。

    var lElem:Array = findLinkElement(textFlow, []);
    
    private function findLinkElement(group:FlowGroupElement, arr:Array):Array {
        var childGroups:Array = [];
        for (var i:int = 0; i < group.numChildren; i++) {
            var element:FlowElement = group.getChildAt(i);
            if (element is LinkElement) {
                arr.push(element as LinkElement);
            } else if (element is FlowGroupElement) {
                childGroups.push(element);
            }
        }
    
        for (i = 0; i < childGroups.length; i++) {
            var childGroup:FlowGroupElement = childGroups[i];
            findLinkElement(childGroup, arr);               
        }
    
        return arr;
    }
    
  3. 見つかった各要素について、境界を取得してみてください。

    for each (var le:LinkElement in lElem){
        var abs:int = le.getAbsoluteStart(); 
        var tl:TextLine = le.getTextFlow().flowComposer.getLineAt(abs).getTextLine(true);
        var rect:Rectangle = tl.getAtomBounds(tl.getAtomIndexAtCharIndex(abs));   
    }
    

flowComposer が null であるため、Textline を取得できないようです。

境界を取得する方法/作曲家が常にnullである理由はありますか?

4

1 に答える 1

1

問題は、flowComposer が null であることではありません。これは実際にはオブジェクトですが、この式には非常に長いオブジェクトのチェーンがあり、そのチェーンの他の何かが null です。

var tl:TextLine = le.getTextFlow().flowComposer.getLineAt(abs).getTextLine(true);

問題は、それぞれの文字インデックスを取得していることですLinkElement。これは行番号ではありません。したがって、flowComposer.getLineAt(abs)その行が存在しないため、null が返されます。

代わりに、 を使用しますflowComposer.getLineAtPosition(abs)。また、最適化のため、フロー全体が生成されていない場合があります。したがって、これを行う前に、 を呼び出すのが賢明flowComposer.composeToPosition(abs)です。

以下は、上記を行うために修正したコードです。呼び出しは必要ないかもしれませんが、composeToPosition()実際にはループ内で何度も実行するとパフォーマンスの問題になる可能性があります。それはあなたの判断にお任せします。

これが私が使用したコードです(私のhtml変数の宣言を差し引いたものです)。私が修正した関連コードは、そのfor eachループ内にあります。

var container:Sprite = new Sprite;
stage.addChild(container);
var textFlow:TextFlow = TextConverter.importToFlow(html, TextConverter.TEXT_FIELD_HTML_FORMAT);
var controller:ContainerController = new ContainerController(container, 200,200);
textFlow.flowComposer.addController(controller);
textFlow.flowComposer.updateAllControllers();
var links:Array = findLinkElement(textFlow, []);

// modified this code
for each (var le:LinkElement in links){
    var abs:int = le.getAbsoluteStart(); 
    var composer:IFlowComposer = le.getTextFlow().flowComposer;
    composer.composeToPosition(abs);
    var textFlowLine:TextFlowLine = composer.findLineAtPosition(abs);
    var tl:TextLine = textFlowLine.getTextLine(true);
    var rect:Rectangle = tl.getAtomBounds(tl.getAtomIndexAtCharIndex(abs));   
}
于 2013-02-19T11:52:14.790 に答える