Просмотр полной версии : MouseEvent для объекта вне списка отображения
Ситуация такая. в приложении air для ios использую native extension для карт. карта отображается поверх всего, я ее не добавляю в список отображения при помощи addChild, а просто создаю а ля var map:Map = new Map(/*параметры*/); и появляется карта с заданными параметрами.
мне нужно поймать события мыши(DOWN , UP), случившиеся на этой карте, но тк карта не находится в списке отображения, то stage не получает этих событий, они перехватываются картой и не идут куда-либо еще.
Может есть какие-то настройки или методы уровня приложения, позволяющие как-то решить эту проблему?
Final Hope
29.05.2013, 13:43
Как же тогда карта отображается, если она не в списке отображения?
это нативное расширение. то есть, насколько я понимаю, отображается часть нативного ios-ного содержимого, которая показывается поверх всего приложения и является другой сущностью. поверх этих карт ничего добавить нельзя. как например stageWebWiew отображает веб-страницы.
Idon'tKnow
29.05.2013, 14:28
Может поможет, точнее поможет, если Вы можете добавить экземпляр на сцену(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);
}
}
}
}
тот объект, что представляет карту, не может быть добавлен на сцену - он унаследован от EventDispatcher(конечное звено).
Final Hope
29.05.2013, 15:11
Предположу, что раз карта нативная, значит и события нужно обрабатывать нативно, а потом просто перенаправлять события во флэш. Может, так надо?
Idon'tKnow
29.05.2013, 15:31
Его и не нужно добавлять, я просто пытаюсь воссоздать Ваш код, примерно, как это работает.
В основном классе, где всё происходит, у Вас доступ к 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);
}
}
}
}
2. класс, представляющий map'у.
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. Или у Вас проблема в том, что Вы не можете обрабатывать события для карты вообще? Т.е они в никуда летят?
Предположу, что раз карта нативная, значит и события нужно обрабатывать нативно, а потом просто перенаправлять события во флэш. Может, так надо?
Это был бы идеальный вариант, только ANE для карт, которое я использую, не предполагает обработку событий мыши, а готовые расширения для проброса нативных событий мыши во флеш есть только для десктопа. Но во мне еще теплится надежда, что есть другой выход помимо написания самостоятельно такого расширения. Какая-нибудь настройка на уровне приложения. Но видимо зря я надеюсь:(
Нужна возможность добавить экземпляр в список отображения Такой возможности нет. есть некий программный мост, называемый 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.");
}
}
Добавлено через 1 час 0 минут
Решение найдено - то расширение, которое я использую, таки поддерживает свой собственный MAP_TOUCHED ивент:)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.