PDA

Просмотр полной версии : Как отобразить картинку со стороннего сайта во флеш?


carver_joy
04.02.2011, 16:43
Ребята собственно такой вопрос, как отобразить картинку со стороннего сайта во флеше + еще интересует как реализовать загрузку текста тоже с другого сайта, например из файла text.txt расположенного например по адресу http://site.ru/text.txt

mooncar
04.02.2011, 17:54
1. Изображения и сторонние swf.

Посмотрите пример по классу MovieClipLoader.
Например, откройте новый проект, вставьте следующий код в кадр и проверьте его работу:
var cont:MovieClip = this.createEmptyMovieClip('container_mc', this.getNextHighestDepth());
var mcl:MovieClipLoader = new MovieClipLoader();
mcl.loadClip('http://www.flasher.ru/forum/images/russian/flasher_logo.gif', cont);
Только есть одно важное обстоятельство: полноценно использовать загруженный контент можно только при наличии разрешения со стороны владельца сайта. Технически это выражается в том, что на стороннем сайте должен находится кросдоменник, т.е. файл политики безопасности crossdomain.xml (обычно лежит в корне), в котором указаны домены, флешкам с которых разрешено грузить и использовать их контент.
Без такого разрешения мало что можно сделать с загруженным. Например, можно изменить масштаб или аналогичные простые действия:
var cont:MovieClip = this.createEmptyMovieClip('container_mc', this.getNextHighestDepth());
var mcl:MovieClipLoader = new MovieClipLoader();

var listener:Object = new Object();

listener.onLoadInit = function (mc:MovieClip)
{
mc._xscale = mc._yscale = 50;
};

mcl.addListener(listener);

mcl.loadClip('http://www.flasher.ru/forum/images/russian/flasher_logo.gif', cont);
, однако более сложные действия без кроссдоменника с разрешением не получатся (например, отрисовать и манипулировать битмапой).

Отдельно обращаю внимание:

1) Оперировать загруженным начинать можно только изнутри обработчика события onLoadInit, как видно из примера выше. Это связано с асинхронностью работы кода, требуется отследить момент готовности загружаемого контента для начала каких-либо действий с ним.

2) Проверять лучше всего не из среды разработки, так как в ней все будет работать и без кросдоменника, а непосредственно либо из standalone плеера, либо будучи уже залитым на хостинг.

2. Текст и переменные из файлов.

По второму вопросу - ситуация похожая.
Только класс там нужно использовать LoadVars. В хелпе есть множество примеров по использованию методов этого класса, предназначенных для загрузки текстовой информации из файлов. Для загрузки и отображения текста "as is" используйте метод load и обработчик события onData. Для получения набора значений переменных и их разбора - обработчик onLoad.

Вообще, если с хелпом дружите, то проблем у вас быть не должно, в нем масса примеров по методам и свойствам этих классов. Но и на форуме есть много примеров для конкретных ситуаций.

Не вздумайте только использовать такие функции как loadMovie (для картинок) или loadVariables (для текста). Морально устарели и влекут за собой кучу проблем при попытке полноценного использования загруженного.

Hauts
05.02.2011, 11:02
mooncar, в очередной раз у вас шикарный ответ.

mooncar
05.02.2011, 11:21
Спасибо. Удобно тем, что потом можно ссылку давать.

Hauts
05.02.2011, 11:31
Из таких ссылок можно составить краткий курс для начинающих :)

carver_joy
05.02.2011, 22:36
mooncar,
Громадное спасибо - так много всего расписали! Все сидел делал, старался самостоятельно разобраться, но у меня некоторые вопросы все же остались, в коде написал:
xmlData = new XML();
xmlData.ignoreWhite = true;
xmlData.load("data.xml");
xmlData.onLoad = function(success:Boolean){
//вот например отсюда данные могут попасть
a = 1;
}
//вот сюда?
txt.text = a;

Такое ощущение, что за onLoad они не могут выбраться даже _global
_______________

И немного про другое:
http://flasher.ru/forum/showthread.php?t=146415&highlight=loadVars&p=948129
var strings:Array = [];

var lv:LoadVars = new LoadVars();
lv.onData = lv_onDataHandler;
lv.load("1.txt");

function lv_onDataHandler(source:String):Void
{
strings = source.split("\r\n");
}

Я так понимаю данные считанны в массив strings, а что там в коде добавить, чтоб работать с ними как с массивом? Чтоб можно вывести на экран например вот так:
txt.text = strings[3]; //в текстовом поле отобразиться 3я строка из файла 1.txt
Вот этого не понял. И еще раз большое спасибо за подробное разъяснение!

Hauts
05.02.2011, 23:52
По первому вопросу — onLoad вызывается, когда произошла полная загрузка, это не зависит от выполнения самого кода. В вашем случае переменная "a" будет инициализирована только после полной загрузки, но вы же пытаетесь ее использовать сразу же после того, как начали загрузку.

По второму вопросу — все, вроде правильно. Функция split возвращает массив из элементов строки, разделенных каким-либо символом.

split("") вернет массив из символов, по одному.

split("\n") вернет массив из строк.

mooncar
06.02.2011, 05:43
Автор, совет вам по первому вопросу.
Я, например, все внешние данные стараюсь получать еще в прелоадере, в котором учитываются загрузка их всех. После перехода в рабочий кадр все данные становятся уже доступны.

PS. Не надо никаких _global.
PPS. На будущее. Один вопрос - одна тема.

dark256
06.02.2011, 14:09
Просто так, до кучи, относительно анализа кода. Удобно для анализа ХМЛ-ей. Сам недавно нашел и везде теперь втыкаю. А то фиг поймешь что где глючит.


if (xmlData.status != 0)
{
var errorMessage:String;
switch (xmlData.status)
{
case -2 :
errorMessage = "A CDATA section was not properly terminated.";
break;
case -3 :
errorMessage = "The XML declaration was not properly terminated.";
break;
case -4 :
errorMessage = "The DOCTYPE declaration was not properly terminated.";
break;
case -5 :
errorMessage = "A comment was not properly terminated.";
break;
case -6 :
errorMessage = "An XML element was malformed.";
break;
case -7 :
errorMessage = "Out of memory.";
break;
case -8 :
errorMessage = "An attribute value was not properly terminated.";
break;
case -9 :
errorMessage = "A start-tag was not matched with an end-tag.";
break;
case -10 :
errorMessage = "An end-tag was encountered without a matching start-tag.";
break;
default :
errorMessage = "An unknown error has occurred.";
break;
}
trace ( "XML Structure Error:"+prof.status+" - "+errorMessage
}