Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MouseEvent для объекта вне списка отображения (http://www.flasher.ru/forum/showthread.php?t=200050)

o_oxana 29.05.2013 13:26

MouseEvent для объекта вне списка отображения
 
Ситуация такая. в приложении air для ios использую native extension для карт. карта отображается поверх всего, я ее не добавляю в список отображения при помощи addChild, а просто создаю а ля
Код AS3:

var map:Map = new Map(/*параметры*/);

и появляется карта с заданными параметрами.

мне нужно поймать события мыши(DOWN , UP), случившиеся на этой карте, но тк карта не находится в списке отображения, то stage не получает этих событий, они перехватываются картой и не идут куда-либо еще.
Может есть какие-то настройки или методы уровня приложения, позволяющие как-то решить эту проблему?

Final Hope 29.05.2013 13:43

Как же тогда карта отображается, если она не в списке отображения?

o_oxana 29.05.2013 13:52

это нативное расширение. то есть, насколько я понимаю, отображается часть нативного ios-ного содержимого, которая показывается поверх всего приложения и является другой сущностью. поверх этих карт ничего добавить нельзя. как например stageWebWiew отображает веб-страницы.

Idon'tKnow 29.05.2013 14:28

Может поможет, точнее поможет, если Вы можете добавить экземпляр на сцену(Stage). Т.е это должно работать, если такая возможность есть. :) (Изменил код, т.к более логичная идея появилась.)

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
 
        public class Main extends Sprite
        {
        var map:Sprite;
        var communication:Sprite;
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        map = new Sprite();
                        map.graphics.lineStyle(1);
                        map.graphics.beginFill(0x000000);
                        map.graphics.drawCircle(250, 250, 50);
                        addChild(map);
                        map.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener);
 
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, stageMouseDownListener);
                        communication = new Sprite();
                        communication.name = "communication";
                        stage.addChild(communication);
 
                }
 
                private function mouseDownListener(e:MouseEvent):void {
                        trace("down mouse at the map!");
                        communication.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN));
                }
 
                private function stageMouseDownListener(e:MouseEvent):void {
                        if (e.target == communication){
                        trace("stage event!" + " event target = " + e.target.name);
                        }
                }
        }       
}


o_oxana 29.05.2013 14:53

тот объект, что представляет карту, не может быть добавлен на сцену - он унаследован от EventDispatcher(конечное звено).

Final Hope 29.05.2013 15:11

Предположу, что раз карта нативная, значит и события нужно обрабатывать нативно, а потом просто перенаправлять события во флэш. Может, так надо?

Idon'tKnow 29.05.2013 15:31

Его и не нужно добавлять, я просто пытаюсь воссоздать Ваш код, примерно, как это работает.
В основном классе, где всё происходит, у Вас доступ к stage есть? (Нужна возможность добавить экземпляр в список отображения)
Если есть доступ, то ниже пример, немного изменил код, если доступа нет, можете не смотреть код.

1. класс, имеющий доступ к Stage.

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite
        {
        var communication:Sprite; // класс, который должен иметь доступ к stage.
        var mapka:map; // карта.
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        communication = new Sprite();
                        communication.name = "communication";
                        stage.addChild(communication); // если есть возможность сделать вот это, то это всё будет работать.
                        mapka = new map();
                        stage.addChild(mapka);
// саму мапку Вы не добавляете, я же добавляю,
//чтобы воссоздать Ваш случай, если она у Вас получает события, то мне нужно,
//чтобы она получала их тоже, поэтому я добавляю на сцену.
                        mapka.addEventListener(MouseEvent.MOUSE_DOWN, mapkaListener);
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, stageListener);
                }
 
                private function mapkaListener(e:MouseEvent):void {
                        trace("mapka mouse down!");
                        communication.dispatchEvent(e); // перенаправляю событие для stage'a.
                }
 
                private function stageListener(e:MouseEvent):void {
                if (e.target == communication){
                        trace("stage mouse down!" + "событие пришло из = " + e.target.name);
                        }
                }
        }       
}

2. класс, представляющий map'у.

Код AS3:

package  
{
        import flash.display.Sprite;
        public class map extends Sprite
        {
 
                public function map()
                {
                                graphics.lineStyle(1);
                                graphics.beginFill(0x000000);
                                graphics.drawCircle(100, 150, 50);       
                }
 
        }
 
}

P.S. Или у Вас проблема в том, что Вы не можете обрабатывать события для карты вообще? Т.е они в никуда летят?

o_oxana 29.05.2013 16:24

Цитата:

Сообщение от Final Hope (Сообщение 1135406)
Предположу, что раз карта нативная, значит и события нужно обрабатывать нативно, а потом просто перенаправлять события во флэш. Может, так надо?

Это был бы идеальный вариант, только ANE для карт, которое я использую, не предполагает обработку событий мыши, а готовые расширения для проброса нативных событий мыши во флеш есть только для десктопа. Но во мне еще теплится надежда, что есть другой выход помимо написания самостоятельно такого расширения. Какая-нибудь настройка на уровне приложения. Но видимо зря я надеюсь:(


Цитата:

Сообщение от Idon'tKnow (Сообщение 1135410)
Нужна возможность добавить экземпляр в список отображения

Такой возможности нет. есть некий программный мост, называемый air native extension(ANE), позволяющий вызывать нативные функции среды(а именно отображать карты и производить с ними некоторый ограниченный набор манипуляций). если Вам интересно, то конструктор класса Map выглядит так:
Код AS3:

public function Map() 
                {
                        NativeMaps.init(DISTRICT_ANE_KEY);
 
                        if(NativeMaps.isSupported)
                        {
                                NativeMaps.service.createMap(mapWidth, mapHeight, mapX, mapY, MapType.MAP_TYPE_HYBRID);
                        }
                        else
                        {
                                //Notsupported
                                trace("NativeMaps not supported on this platform.");
                        }
 
                }

Добавлено через 1 час 0 минут
Решение найдено - то расширение, которое я использую, таки поддерживает свой собственный MAP_TOUCHED ивент:)


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

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