Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.05.2013, 13:26
o_oxana вне форума Посмотреть профиль Отправить личное сообщение для o_oxana Найти все сообщения от o_oxana
  № 1  
Ответить с цитированием
o_oxana

Регистрация: Oct 2010
Сообщений: 36
По умолчанию MouseEvent для объекта вне списка отображения

Ситуация такая. в приложении air для ios использую native extension для карт. карта отображается поверх всего, я ее не добавляю в список отображения при помощи addChild, а просто создаю а ля
Код AS3:
var map:Map = new Map(/*параметры*/);
и появляется карта с заданными параметрами.

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

Старый 29.05.2013, 13:43
Final Hope вне форума Посмотреть профиль Найти все сообщения от Final Hope
  № 2  
Ответить с цитированием
Final Hope
Banned
[+5 04.06.13]
[+1 08.06.13]

Регистрация: May 2013
Сообщений: 52
Как же тогда карта отображается, если она не в списке отображения?

Старый 29.05.2013, 13:52
o_oxana вне форума Посмотреть профиль Отправить личное сообщение для o_oxana Найти все сообщения от o_oxana
  № 3  
Ответить с цитированием
o_oxana

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

Старый 29.05.2013, 14:28
Idon'tKnow вне форума Посмотреть профиль Отправить личное сообщение для Idon'tKnow Найти все сообщения от Idon'tKnow
  № 4  
Ответить с цитированием
Idon'tKnow

Регистрация: Apr 2013
Сообщений: 77
Может поможет, точнее поможет, если Вы можете добавить экземпляр на сцену(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);
			}
		}
	}	
}


Последний раз редактировалось Idon'tKnow; 29.05.2013 в 14:49. Причина: изменил код.
Старый 29.05.2013, 14:53
o_oxana вне форума Посмотреть профиль Отправить личное сообщение для o_oxana Найти все сообщения от o_oxana
  № 5  
Ответить с цитированием
o_oxana

Регистрация: Oct 2010
Сообщений: 36
тот объект, что представляет карту, не может быть добавлен на сцену - он унаследован от EventDispatcher(конечное звено).

Старый 29.05.2013, 15:11
Final Hope вне форума Посмотреть профиль Найти все сообщения от Final Hope
  № 6  
Ответить с цитированием
Final Hope
Banned
[+5 04.06.13]
[+1 08.06.13]

Регистрация: May 2013
Сообщений: 52
Предположу, что раз карта нативная, значит и события нужно обрабатывать нативно, а потом просто перенаправлять события во флэш. Может, так надо?

Старый 29.05.2013, 15:31
Idon'tKnow вне форума Посмотреть профиль Отправить личное сообщение для Idon'tKnow Найти все сообщения от Idon'tKnow
  № 7  
Ответить с цитированием
Idon'tKnow

Регистрация: Apr 2013
Сообщений: 77
Его и не нужно добавлять, я просто пытаюсь воссоздать Ваш код, примерно, как это работает.
В основном классе, где всё происходит, у Вас доступ к 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. Или у Вас проблема в том, что Вы не можете обрабатывать события для карты вообще? Т.е они в никуда летят?


Последний раз редактировалось Idon'tKnow; 29.05.2013 в 15:46.
Старый 29.05.2013, 16:24
o_oxana вне форума Посмотреть профиль Отправить личное сообщение для o_oxana Найти все сообщения от o_oxana
  № 8  
Ответить с цитированием
o_oxana

Регистрация: Oct 2010
Сообщений: 36
Цитата:
Сообщение от Final Hope Посмотреть сообщение
Предположу, что раз карта нативная, значит и события нужно обрабатывать нативно, а потом просто перенаправлять события во флэш. Может, так надо?
Это был бы идеальный вариант, только ANE для карт, которое я использую, не предполагает обработку событий мыши, а готовые расширения для проброса нативных событий мыши во флеш есть только для десктопа. Но во мне еще теплится надежда, что есть другой выход помимо написания самостоятельно такого расширения. Какая-нибудь настройка на уровне приложения. Но видимо зря я надеюсь


Цитата:
Сообщение от Idon'tKnow Посмотреть сообщение
Нужна возможность добавить экземпляр в список отображения
Такой возможности нет. есть некий программный мост, называемый 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, время: 17:33.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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