Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   AIR mobile, внешний swf и события от мыши (http://www.flasher.ru/forum/showthread.php?t=210896)

AlexeyB2010 22.05.2015 20:04

AIR mobile, внешний swf и события от мыши
 
Добрый день форучане!
Столкнулся с очень непонятной ситуацией.
Создаю проект AIR-mobile, в нём простой загрузчик внешней swf (без кода, просто один клип с шейпом в нём), указываю контекст, всё как положено. Файл пробовал грузить и с диска, локально и с сайта и из локального хранилища приложения (app-storage).
Всё загружается, вешаю события от мыши на загруженный клип, на сцену и на созданный программно спрайт.
И вот тут начинаются странности - события от мыши не поднимаются по стэку объектов, т.е если кликаем по спрайту - события получает только он, но не клип и не сцена, если по клипу - то только он и не сцена.

Переношу ровно этот же код в приложение AIR-flashplayer и события работают как положено. Единственное отличие тут - вызов Security.allowDomain("*"), который для mobile-версии конечно не работает.
Что это? Баг Adobe?

Вот код данного примера:
Код AS3:

                private function testLoad3(a_strURL:String): void
                {
                        var loader:Loader;
                        var        context:LoaderContext;
 
                        loader        = new Loader();
                        context        = new LoaderContext(false, ApplicationDomain.currentDomain, null);
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
                        loader.load(new URLRequest(a_strURL), context);
                }
 
                private function onComplete(e:Event):void
                {
                var loader:Loader = LoaderInfo(e.currentTarget).loader;
                var content:MovieClip = loader.content as MovieClip;
 
                        addChild(content);
 
                        var clip:Sprite = new Sprite();
                        clip.graphics.beginFill(0x00FF00, 0.5);
                        clip.graphics.drawRect(200, 200, 200, 200);
                        clip.buttonMode = true;
                        content.addChild(clip);
 
                        clip.addEventListener(MouseEvent.CLICK, onClickSprite);
                        content.addEventListener(MouseEvent.CLICK, onClickClip);
                        stage.addEventListener(MouseEvent.CLICK, onClickStage);
                }
 
                private function onClickSprite(e:MouseEvent):void
                {
                        trace("Sprite clicked");
                }
 
                private function onClickClip(e:MouseEvent):void
                {
                        trace("Clip clicked");
                }
 
                private function onClickStage(e:MouseEvent):void
                {
                        trace("Stage clicked");
                }


caseyryan 22.05.2015 20:48

Ну так на мобилах же Touch а не мышь. Видимо там полноценной поддержки мыши вообще не предустмотрено. Тач события работают как надо

AlexeyB2010 22.05.2015 21:20

Вообще Adobe советует использовать именно мышиные события, если нет особой необходимости.
А Touch вообще что-то не работает, может потому что на эмуляторе тестируем, а на устройстве будут?

В любом случае, тут явно дело в Security, если тот же Sprite из примера приаттачить не к загруженному клипу, а прямо к stage, то события через Sprite до stage доходят.
Т.е. загруженный клип таким образом изолируется что ли?

Добавлено через 19 минут
Попробовали на устройстве с Touch'ами - та же история, события не всплывают.

PainKiller 29.05.2015 16:48

Соберите минимальный тестовый пример воспроизводящий проблему, мне даже интересно стало, разрабатываю под мобилы и никогда не замечал отличий MouseEvent на них от обычного плеера.

AlexeyB2010 01.06.2015 19:03

Вложений: 1
Вот тестовый проект для FlashBuilder.

Собственно проблему мы решили, вот тут описан обходной хак: https://code.google.com/p/maashaack/...licationDomain
В AIR действительно есть какие-то не очень внятные ограничения на скачиваемые swf. Всё что нужно сделать, так это загрузить нужную нам swf обычным способом через Loader.load, а после эти загруженные данные загрузить ещё раз, но через Loader.loadBytes, который игнорирует Security-ограничения.


Часовой пояс GMT +4, время: 17:40.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.