|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Oct 2010
Сообщений: 36
|
MouseEvent для объекта вне списка отображения
Ситуация такая. в приложении air для ios использую native extension для карт. карта отображается поверх всего, я ее не добавляю в список отображения при помощи addChild, а просто создаю а ля
и появляется карта с заданными параметрами.
мне нужно поймать события мыши(DOWN , UP), случившиеся на этой карте, но тк карта не находится в списке отображения, то stage не получает этих событий, они перехватываются картой и не идут куда-либо еще. Может есть какие-то настройки или методы уровня приложения, позволяющие как-то решить эту проблему? |
|
|||||
Banned
[+5 04.06.13]
[+1 08.06.13] Регистрация: May 2013
Сообщений: 52
|
Как же тогда карта отображается, если она не в списке отображения?
|
|
|||||
Регистрация: Oct 2010
Сообщений: 36
|
это нативное расширение. то есть, насколько я понимаю, отображается часть нативного ios-ного содержимого, которая показывается поверх всего приложения и является другой сущностью. поверх этих карт ничего добавить нельзя. как например stageWebWiew отображает веб-страницы.
|
|
|||||
Регистрация: Apr 2013
Сообщений: 77
|
Может поможет, точнее поможет, если Вы можете добавить экземпляр на сцену(Stage). Т.е это должно работать, если такая возможность есть. (Изменил код, т.к более логичная идея появилась.)
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); } } } } Последний раз редактировалось Idon'tKnow; 29.05.2013 в 14:49. Причина: изменил код. |
|
|||||
Регистрация: Oct 2010
Сообщений: 36
|
тот объект, что представляет карту, не может быть добавлен на сцену - он унаследован от EventDispatcher(конечное звено).
|
|
|||||
Banned
[+5 04.06.13]
[+1 08.06.13] Регистрация: May 2013
Сообщений: 52
|
Предположу, что раз карта нативная, значит и события нужно обрабатывать нативно, а потом просто перенаправлять события во флэш. Может, так надо?
|
|
|||||
Регистрация: Apr 2013
Сообщений: 77
|
Его и не нужно добавлять, я просто пытаюсь воссоздать Ваш код, примерно, как это работает.
В основном классе, где всё происходит, у Вас доступ к stage есть? (Нужна возможность добавить экземпляр в список отображения) Если есть доступ, то ниже пример, немного изменил код, если доступа нет, можете не смотреть код. 1. класс, имеющий доступ к Stage. 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); } } } } P.S. Или у Вас проблема в том, что Вы не можете обрабатывать события для карты вообще? Т.е они в никуда летят? Последний раз редактировалось Idon'tKnow; 29.05.2013 в 15:46. |
|
|||||
Регистрация: Oct 2010
Сообщений: 36
|
Цитата:
Такой возможности нет. есть некий программный мост, называемый air native extension(ANE), позволяющий вызывать нативные функции среды(а именно отображать карты и производить с ними некоторый ограниченный набор манипуляций). если Вам интересно, то конструктор класса Map выглядит так: 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."); } } Решение найдено - то расширение, которое я использую, таки поддерживает свой собственный MAP_TOUCHED ивент |
Часовой пояс GMT +4, время: 01:52. |
|
« Предыдущая тема | Следующая тема » |
|
|