#flash #actionscript-3 #actionscript #loader #movieclip
#flash #actionscript-3 #actionscript #загрузчик #movieclip
Вопрос:
то, что я пытаюсь сделать, это получить доступ
snapText = scrollPane.source.textSnapshot;
из внешнего swf-файла. Я пробовал:
trace("-->: " scrollPane.source.textSnapshot.getText(0, 1000));
trace("-->: " myLoader.content.textSnapshot.getText(0, 1000));
trace("-->: " mc.textSnapshot.getText(0, 1000));
trace("-->: " mc.getChildAt(0).textSnapshot.getText(0, 1000));
trace("-->: " mc.getChildByName(myLoader).textSnapshot.getText(0, 1000) );
trace("-->: " scrollPane.content.textSnapshot.getText(0, 100));
все это было бесполезно. Кстати:
mc.getChildAt(0).textSnapshot.getText(0, 1000)
выдает ошибку:
1119: Access of possibly undefined property textSnapshot through a reference with static type flash.display:DisplayObject.
хотя я знаю, что метод существует.
весь приведенный выше код выполняется в функции checkHandler:
myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, checkHandler);
таким образом, swf-файл должен был быть полностью загружен.
Текст тоже есть, я проверил с помощью swf-декомпилятора.
видеоролик с загрузчиком создается следующим образом
scrollPane = MovieClip(root).scrollPaneOnStage;
myLoader.load(new URLRequest("tmp1.swf"));
mc.addChild(myLoader);
scrollPane.source = mc;
заранее спасибо!
ОБНОВЛЕНИЕ — все еще не решено
Теперь я получаю доступ к swf, как указал HotN.
function checkHandler(evt:Event):void {
libMC = evt.target.content as MovieClip;
libMC.gotoAndStop(0);
trace(libMC.textSnapshot.getText(0, 100));
snapText = libMC.textSnapshot;
scrollPane.source = mc;
}
Сначала это привело к ошибке, поскольку загрузчик в сценарии as3 не может загрузить фильм as2 (т. Е. AVM1). итак, я создал swf-файл AVM2, который привел к ошибке: ошибка# 2000: нет активного контекста безопасности.В качестве решения я использовал класс из http://www.igorcosta.org/?p=231 чтобы загрузить swf-файл, но по-прежнему не могу получить доступ к textSnapshot:
trace(libMC.textSnapshot.getText(0, 100));
ничего не возвращает и не выдает ошибку!
Кстати: хотя я мог бы изменить формат swf, я не могу изменить сам файл, поскольку он генерируется автоматически.
Ответ №1:
Чтобы ссылаться на что-либо в загруженном swf-файле, вам нужно просмотреть содержимое загрузчика, который вы использовали для загрузки swf-файла. Это даст вам эту ссылку:
function checkHandler(e:Event):void {
var loadedSWF:Object = e.target.content;
}
Перейдя loadedSWF
, вы можете получить доступ к содержимому swf-файла, предполагая, что они настроены на общедоступность.
Комментарии:
1. итак, мне потребовалось некоторое время, чтобы отчитаться. теперь я попытался получить доступ к swf-файлу по-своему, что кажется шагом в правильном направлении. кроме того, я обнаружил, что загрузчик в скрипте as3 не может загрузить фильм as2 (т. Е. AVM1). итак, я создал swf-файл AVM2 , который привел к ошибке: ошибка# 2000: нет активного контекста безопасности. Поэтому я использовал пользовательский класс отсюда igorcosta.org/?p=231 чтобы загрузить swf, но я все еще не могу получить доступ к textSnapshot.
Ответ №2:
Используете ли вы механизм TLF (текстовые поля TLF)? Механизм Flash CS5 TLF вызывает некоторые ошибки при загрузке SWF-файлов и попытке получить доступ к свойствам или методам этих загруженных SWF-файлов. Вы можете прочитать все об этом в этом сообщении в блоге Стивена Сакса .
Если это так, решение довольно простое: измените текстовые поля TLF на обычные (они помечены как классический текст, на панели свойств текстового поля есть селектор), и (надеюсь) все будет работать нормально, без дальнейших изменений кода.
Если вам нужны тексты TLF и вы не можете обойтись обычными, вы можете найти пару решений (больше похожих на обходные пути, но неважно) в этом Adobe Technote.
Надеюсь, это поможет!
Комментарии:
1. очень хороший ввод, большое спасибо. однако входной swf-файл не использует механизм tlf.
Ответ №3:
Так что это заняло у меня слишком много времени, но я разобрался.
//... {
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, checkHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
context.checkPolicyFile = false;
loader.load(new URLRequest("tmp1.swf"), context);
//..... }
function checkHandler(evt:Event):void {
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,checkHandler);
libMC = loader.content as MovieClip;
//works now!
libMC.textSnapshot.getText(100, 200);
scrollPane.source = libMC;
}
итак, хитрость заключалась в использовании стандартной функции загрузчика, как предлагалось так много раз. однако flash каким-то образом изменяет настройки безопасности / изолированной среды на моем локальном компьютере, что привело к ошибке # 2000: нет активного контекста безопасности. однако при загрузке на удаленный сервер он по-прежнему работал нормально, что странно. вы можете установить для локальных настроек воспроизведения значение «доступ только к локальным файлам» в меню «Файл»> «Настройки публикации», но в моем случае это совсем не помогло…