Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   расфокусировка и бездействие (http://www.flasher.ru/forum/showthread.php?t=188047)

says 28.11.2012 02:43

расфокусировка и бездействие
 
Здавствуйте,ситуация такая:у меня есть кнопка,при нажатии на которую выскакивает окно с информацие и еще одной кнопкой.

Как сделать что бы при появлении инфо окна,оно вылазило на передний план а задний расфокусировывался и стал бездейственным?

Код AS3:

package
{
        import flash.display.*;
        import flash.event.*;
        public class A extends MovieClip
        {
                var btn:Btn = new Btn();//кнопка
                var btnInfo:BtnInfo = new BtnInfo();обект содержащий в себе информацию и кнопку.
                var fon:Fon = new Fon();//обект который должен быть расфокусирован и обездействован(это кнопка )
                public function A()
                {
                addChild(fon);
                fon.addEventListener(MouseEvent.CLICK,func);
                }
    }
        function func(e:MouseEvent)
        {
                addChild(btnInfo);       
        }
 
}

з.ы. в коде могут быть ошибки,писал на скорую руку

vitamin4er 28.11.2012 03:42

Не уверен, что особо помогу вам, но в as3 есть слушатели фокуса. И соответсвенно, когда фокус с "заднего плана" снимаеться и вызываеться что-то вроде отмены реакции на событие...щяс Колина Мука полистаю, освежу память, отпишу если найду.

caseyryan 28.11.2012 08:15

Цитата:

Как сделать что бы при появлении инфо окна,оно вылазило на передний план а задний расфокусировывался и стал бездейственным?
Самый простой и эффективный способ сделать это - добавить под верхнее окно спрайт с прозрачной заливкой, полностью заполняющий окно флеш плеера. А по удалению информационного окна, соответственно, удалить и этот спрайт.
Одно но, спрайт должен позиционироваться по глобальным координатам, т.е. его точка регистрации должна находиться в том же месте, где 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
чтобы не подписывать окно на события, и не привязывать к нему лишние ссылки. При удалении окна, ссылки на колбэки просто зануляются

says 29.11.2012 15:28

спасибо,вы не могли бы поподробнее расписать строки в программе?


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

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