Очень полезный пост, на основе него сделал чат. Немного доработал, т.к. хотел что бы весь текст можно было выделить мышкой и скопировать.
Я не стал разбивать весь текст на отдельные строки, а поступил так:
При добавлении строки со смайлами в текстовое поле, я точно так же заменяю смайлики на пробел со стилем, а вот сам порядковый номер смайла (от самого начала текста) добавляю в массив arrayIco. т.е. у меня получается массив координат смайлов - вычесленные всего один раз - при добавлении строки! Это - самая долгая операция.
Дальше уже при отображении, на событиях скроллинга, прокрутки колесом мышки, вызываю функцию, которая выводит смайлы поверх текстового поля, но только те которые необходимо вывести:

Код:
function showPictures(e){
clearPictures();
// вычисление строки в скролленом тексте. tf - TextField
var i = tf.getLineOffset(tf.scrollV-1);
var b = tf.getCharBoundaries(i); // первый символ в строке (х, у)
// определить выводить ли картинку или нет
for(var k =0; k<arrayIco.length; k++){
var z = tf.getCharBoundaries(arrayIco[k].x);
if(z != null ){
if(z.y >= b.y && (z.y < (b.y+tf.height))){
showPicture(z.x, (z.y-b.y), arrayIco[k].type);
}
}
}
}
function clearPictures(){
while (pictures.numChildren>0) pictures.removeChildAt(0);
}
function showPicture(x, y, type){
var pic:Sprite;
switch (type){
case "smile1":
pic = new smile1();
pic.x = x;
pic.y = y;
break;
case "smile2":
pic = new smile2();
pic.x = x;
pic.y = y;
break;
default:
pic = new smile_default();
pic.x = x+7;
pic.y = y+1;
break;
}
pictures.addChild(pic);
}