Как все знают, флэш TextField может показывать картинки в HTML тэгах <img>. И, кстати, не только картинки но и swf ролики через тот же тэг. И все знают как отстойно выглядит загрузка и появление этих картинок в тексте, т.к. разумеется, на их загрузку уходит какое-то время, а пока они не подгрузились, пользователь видит пустое место. И вообще это не красиво, вот так заходишь на сайт, все плавненько и хорошо, а картинки в тексте появляются дерганно и не сразу.
Не все знают, что эти картинки можно прелоадить.
Для начала нам нужен HTML с картинками в тэгах которых есть атрибут id с уникальным значением для каждой картинки. На самом деле, этот атрибут можно подставлять и динамически слегка изменив ниже приведенный reg exp. Но так как я жуткий лентяй, пришлось приписывать id пхпшнику.
Итак, мы загружаем XML из внешнего источника. Допустим, данные у нас в переменной data:XML.
Во-первых, нужно вытащить картинки и их ид, что делается просто с помощью регулярного выражения.
var exp:RegExp = /\<*[img] *[id]= *[\"\']{0,1}([^\"\'\>]*)/ig;
var exp_result:Object;
preloadedImages = new Array();
mytextfield_txt.visible = false;
В preloadedImages будем хранить ссылки на эти картинки, вдруг они нам понадобятся еще. Текстфилд скрываем, чтобы наш срам не видел никто.
Теперь получаем все картинки, а точнее объекты типа Loader, которые эти картинки грузят. Для этого используется метод getImageReference(id:String) класса TextField.
mytextfield_txt.htmlText = data.toString();
var s:String = mytextfield_txt.htmlText;
exp_result = exp.exec(s);
while (exp_result != null)
{
preloadedImages.push(mytextfield_txt.getImageReference(exp_result[1]));
exp_result = exp.exec(s);
}
addEventListener(Event.ENTER_FRAME, handlerCheckForPreloadingImages);
Далее сидим проверяем что у нас загрузилось. Впринципе, можно поставить листнер непосредственно на окончание загрузки лоадера и считать сколько загрузилось, но мне было удобнее сделать так. Соответственно в handlerCheckForPreloadingImages в цикле проверям кто из массива загрузился. И если загрузились все, то показываем текстфилд.
