Показать сообщение отдельно
Старый 28.11.2012, 08:15
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 3  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Как сделать что бы при появлении инфо окна,оно вылазило на передний план а задний расфокусировывался и стал бездейственным?
Самый простой и эффективный способ сделать это - добавить под верхнее окно спрайт с прозрачной заливкой, полностью заполняющий окно флеш плеера. А по удалению информационного окна, соответственно, удалить и этот спрайт.
Одно но, спрайт должен позиционироваться по глобальным координатам, т.е. его точка регистрации должна находиться в том же месте, где 0:0 у стейдж.
Я обычно для подобных систем с придупреждающими окнами создаю специальный менеджер, со статическими методами, который изначально надо один раз инициализировать
Вот самый упрощенный вариант такого менеджера
Код AS3:
package  {
	import flash.display.Stage;
	/**
	 * ...
	 * @author Casey Ryan
	 */
	public class WindowsManager {
 
		private static var stage:	Stage;
 
		public static function initialize(stg:Stage):void {
			stage	= stg;
		}
		public static function showWarning():void {
			if (!stage) throw "класс не инициализирован";
			var warningWindow:WarningWindow = new WarningWindow(); // создаем окно и добавляем на стейдж; об остальном позаботится само окно
			warningWindow.x = (stage.stageWidth - warningWindow.width) / 2;
			warningWindow.y = (stage.stageHeight - warningWindow.height) / 2;
			stage.addChild(warningWindow);
		}
	}
}
import flash.display.Sprite;
import flash.events.Event;
 
internal class WarningWindow extends Sprite {
 
	private var _veil:Sprite = new Sprite();	// спрайт, который закрывает собой всю сцену
 
	public function WarningWindow() {
		graphics.beginFill(0xFFFF00);
		graphics.drawRoundRect(0, 0, 300, 170, 10, 10);
		graphics.endFill();
		addEventListener(Event.ADDED_TO_STAGE, onAdded);
	}
 
	private function onAdded(e:Event):void {
		removeEventListener(Event.ADDED_TO_STAGE, onAdded);
		_veil.graphics.beginFill(0x000000, .1);
		_veil.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
		_veil.graphics.endFill();
		parent.addChildAt(_veil, parent.getChildIndex(this));	// добавляем непосредственно под это окно; используется parent, чтобы вуаль всегда добавлялась именно в тот же контейнер, что и само окно, без передачи дополнительных ссылок на этот контейнер
	}
}
Просто и эффективно. При нажитии кнопки в окне, его можно полностью удалить, вместе с вуалью, так как ссылок на него нигде не сохранится, его уничтожит сборщик мусора.

п.с. Обычно я еще в эти окна передаю колбэки, например onClose, onCancel, onConfirm
чтобы не подписывать окно на события, и не привязывать к нему лишние ссылки. При удалении окна, ссылки на колбэки просто зануляются