Сегодня взялся опробовать новый метод вывода текста в CS4.
Вот что из этого вышло. Думаю вполне неплохо так как ресайз не даёт тормозов даже с большим текстом. Но все-таки кто что может предложит оптимизировать.
А так есть пару вопросов.
Адобовцы заложили способ выделять такой текст?
И ешё если в текстовую линию помещаю графический элемент который больше её то весь текстовый блок пропадает! То есть это так и задумано и надо предварительно те что не влезут ужимать ?

Код AS3:
package {
import flash.display.*;
import flash.events.*;
import flash.utils.Timer;
import flash.text.engine.*;
import LoaderExample;
public class GroupElementExample extends Sprite {
var format:ElementFormat;
var TF:MovieClip=new MovieClip ;
var smileName=[":-)","8-)",":-D"];
var smileNameLink=["0.swf","1.swf","2.swf"];
var mc_array:Array=new Array ;
var loadTimer:Timer=new Timer(500,1);
var textBlock:TextBlock=new TextBlock ;
public function GroupElementExample():void {
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
stage.addEventListener(Event.RESIZE,resizeHandler);
loadTimer=new Timer(100,1);
loadTimer.addEventListener(TimerEvent.TIMER, resizeHandler);
format=new ElementFormat ;
var fontDescription:FontDescription=new FontDescription("Arial");
format.fontSize=16;
format.fontDescription=fontDescription;
getSubstring('"Мы любим тех, кто нас не любит.:-)'+
'Не любим тех, кто любит нас.:-D'+
'Легко доставшиеся губы,:-)'+
'не радуют, а обжигают нас.:-)'+
'Любя далёкое, томимся,:-)'+
'в тоске проводим дни свои.8-)'+
'Мы любим то, к чему стремимся,8-)'+
'а как достигнем, нет любви.":-D',smileName);
TF=new MovieClip ;
addChild(TF);
}
private function resizeHandler(event:Event):void {
var now:Date = new Date();
trace(now.getMilliseconds());
var textElement:TextElement;
var graphicElement:GraphicElement;
var groupVector:Vector.<ContentElement>=new Vector.<ContentElement> ;
if (mc_array.length>0) {
for (var i:Number=0; i<mc_array.length; i++) {
textElement=new TextElement(mc_array[i].xt,format);
graphicElement=new GraphicElement(mc_array[i].img,mc_array[i].img.width,mc_array[i].img.height,format);
groupVector.push(graphicElement,textElement);
}
}
var groupElement=new GroupElement(groupVector);
textBlock.content=groupElement;
createTextLines(textBlock);
var now:Date = new Date();
trace('end '+now.getMilliseconds());
}
private function createTextLines(textBlock:TextBlock):void {
while (TF.numChildren) {
TF.removeChildAt(0);
}
var yPos=0;
var line_length:Number=stage.stageWidth-10;
var textLine:TextLine=textBlock.createTextLine(null,line_length);
while (textLine) {
TF.addChild(textLine);
textLine.x=10;
yPos+=textLine.height+2;
textLine.y=yPos;
textLine=textBlock.createTextLine(textLine,line_length);
}
}
function reDrawSmile(event:Event):void {
trace(event.target.name);
loadTimer.start();
if (event.target.height>30) {
event.target.scaleX=0.4;
event.target.scaleY=0.4;
}
}
function getSubstring(txt:String,smile:Array):void {
var ia:Array;
var index:String;
for (var i=0; i<smile.length; i++) {
if (i<10) {
index='0'+i;
}
txt=txt.split(smile[i]).join('[!img!]'+index+' ');
}
ia=txt.split('[!img!]');
for (var j=0; j<ia.length; j++) {
if (ia[j].length>0) {
j==0?index='':index=ia[j].substr(0,2);
var box=new LoaderExample ;
if (index!='') {
super.addEventListener('load.Complate',this.reDrawSmile);
box.load(smileNameLink[Number(index)]);
}
mc_array.push({img:box,xt:ia[j].substr(index.length)});
}
}
loadTimer.start();
}
}
}