2010-01-25 3 views
0

Je dois définir le format de texte pour certains jetons dans un texte brut. J'essaye d'employer le cadre de disposition de texte pour améliorer la vitesse de l'opération mais j'ai fondé que TLF est beaucoup plus lent (10X dans mes tests) que l'ancien setTextFormat(). Pour chaque jeton, j'appelle cette fonction:Façon rapide de définir le format de texte pour une gamme de texte en utilisant TLF

public function setTextFormat(format:TextLayoutFormat, begin:int, end:int):void{ 

      var selection:SelectionState = new SelectionState(this._textFlow, begin, end, this._normalFormat); 
      IEditManager(_textFlow.interactionManager).applyLeafFormat(format, selection); 

     } 

Y a-t-il une manière plus rapide et plus intelligente de faire cette opération?

Merci

Répondre

1

La plupart du temps de traitement dans ces mises à jour est le TLF recalcul et mise à jour de l'écran. L'association de formats particuliers avec des parties de votre modèle de texte est beaucoup moins intensive. Malheureusement, l'appel applyLeafFormat() effectue à la fois des opérations d'association de format et de redisplay. Vous devez diviser ces deux. Au lieu de traiter uniquement vos jetons en termes de positions absolues, vous pouvez les diviser en objets FlowElement distincts (très probablement SpanElements), qui peuvent être identifiés de manière unique avec une propriété "id". Une fois que vos jetons sont dans des éléments distincts, il devient facile de parcourir une grande partie d'entre eux, de modifier les caractéristiques de format et de ne forcer qu'une mise à jour de l'affichage à la fin.

for each (var id:String in ids) { 
    var element:SpanElement = _textFlow.getElementByID(id) as SpanElement; 
    if (element) { 
     element.format = getAppropriateFormatForElement(element); 
    } 
} 
_textFlow.flowComposer.updateAllControllers(); 

En aparté, diviser vos jetons en éléments ouvre également la porte pour stocker votre jeton dans la classification des éléments eux-mêmes, vous libérant ainsi de maintenir une structure de mise en correspondance de classification distincte.

+0

Cela sonne bien, j'ai immaginé que le problème était que applyLeafFormat() mettre à jour la vue à chaque appel. La question est maintenant, comment puis-je créer FlowElement? je dois changer mon texte en insérant des étiquettes d'envergure? Je ne veux pas changer mon texte parce que j'applique une nouvelle colorisation pour chaque changement de texte et si je mets un nouveau texte sur chaque touche, l'utilisateur voit le texte merci clignote (j'ai essayé avec l'ancien TextArea et htmlText) – wezzy

Questions connexes