Форум 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=149828)

ChuwY 01.02.2011 14:29

Зависание фильтров на объекте
 
Вложений: 1
Сделал для приложения что-то вроде менеджера всплывающих сообщений.
Хотелось, чтобы при показе сообщения остальной фон размывался.
Для этого стал засовывать все остальное в контейнер, на который вешал фильтры.
При отладке в десктопном плеере или через билдер все было отлично.
Но как только залил в контакт с отображением начались странности.
После убирания сообщения фон все равно оставался размыленным "протираясь" курсором (кастомным) или другими движущимися объектами. Не понимаю такое поведение.
Вот несколько упрощенный код менеджера и минимальное приложение для воспроизведения ситуации.
Помогите понять, что я делаю не так.
(если открыть закоменченные строки, все начинает, естественно, работать как надо... Но хочется без них, тк чуть меньше задержка. Да и вообще разобраться хочется)

Код AS3:

package {
        import flash.display.MovieClip;
        import flash.display.DisplayObject;
        import flash.events.MouseEvent;
        import flash.events.Event;
        import flash.display.Sprite;
        import flash.events.KeyboardEvent;
        import flash.filters.BlurFilter;
        import flash.display.Bitmap;
 
 
        public class Main extends MovieClip {
    private static const BG_FILTERS_ARRAY    : Array = new Array(new BlurFilter(7, 7, 1));
                private var _messageLayer : Sprite = new Sprite();
                private var _contentLayer : Sprite = new Sprite();
                private var _messageBox  : Sprite = new Sprite();
                public function Main(){
                        addChild(_contentLayer);
                        addChild(_messageLayer);
 
                        _contentLayer.addChild(new Bitmap(new img_content()));
                        _messageBox.addChild(new Bitmap(new img_message()));
 
                        PopUpsMgr.instance.init(_messageLayer, _contentLayer);
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
                }
 
                private function keyDownHandler(event : KeyboardEvent):void{
                  trace("keyDownHandler");
                        if(_messageBox.parent){
                                _messageBox.dispatchEvent(new Event(Event.CLOSE));
                        } else {
                                PopUpsMgr.instance.showSomeDO(_messageBox);
                        }
                }
        }
}


Код AS3:

package{
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.DisplayObject;
  import flash.display.DisplayObjectContainer;
  import flash.display.Sprite;
  import flash.display.Stage;
  import flash.events.Event;
  import flash.events.MouseEvent;
  import flash.filters.BlurFilter;
  import flash.filters.DropShadowFilter;
  import flash.geom.ColorTransform;
 
  /**
        * @author Chu
        */

 
        public class PopUpsMgr{
                private static const BG_COLOR_TRANSFORM  : ColorTransform = new ColorTransform(0.9, 0.9, 0.9);
                private static const BG_FILTERS_ARRAY    : Array = new Array(new BlurFilter(7, 7, 1));
                private static const MSGBOX_FILTERS_ARRAY : Array = new Array(new DropShadowFilter(0, 0, 0x0, 1, 35, 35, 2, 2));
                private static var _instance : PopUpsMgr;
                private var _bluredContentContainer : Sprite;
                private var _msgsContainer          : DisplayObjectContainer;
                private var _contContIndexInParent  : int;
                private var _parentContentContainer : DisplayObjectContainer;
    private var _contentContainer      : DisplayObjectContainer
                private var _turn                  : Vector.<DisplayObject>;
 
                public function PopUpsMgr(signature : SingletonEnforcer) {
                        if(signature == null) {
                                throw new Error("PopUpsMgr is a singleton class, use 'instance' instead");
                        }
                        _turn = new Vector.<DisplayObject>();
 
                        _bluredContentContainer = new Sprite();
                        _bluredContentContainer.mouseChildren = false;
                        _bluredContentContainer.filters = BG_FILTERS_ARRAY;
                        _bluredContentContainer.transform.colorTransform = BG_COLOR_TRANSFORM;
                }
 
                // static methods
                public static function get instance() : PopUpsMgr {
                        if(_instance == null) {
                                _instance = new PopUpsMgr(new SingletonEnforcer());
                        }
                        return _instance;
                }
 
                // methods
                public function init(msgContainer : DisplayObjectContainer, contentContainer : DisplayObjectContainer):void{
                        _msgsContainer    = msgContainer;       
                        _contentContainer = contentContainer;
                        _msgsContainer.addChild(_bluredContentContainer);                       
                }
 
                public function showSomeDO(DO : DisplayObject):void{
                        DO.x = (_msgsContainer.stage.stageWidth - DO.width)/2;
                        DO.y = (_msgsContainer.stage.stageHeight - DO.height)/2;
                        DO.addEventListener(Event.CLOSE, msgBoxCloseHandler);
                        DO.filters = MSGBOX_FILTERS_ARRAY;
                        standToTurn(DO);       
                }
 
                // private functions
                private function standToTurn(msBox : DisplayObject):void{
                        if(_turn.length){
                                removeFromUp(_turn[_turn.length-1]);
                        } else {
                                hideBg();
                        }
                        _turn.push(msBox);
                        addToUp(msBox);
                }
 
                private function msgBoxCloseHandler(event : Event):void{
                  var closedMsgBox : DisplayObject = _turn[_turn.length -1];       
 
                        removeFromUp(closedMsgBox);
                        closedMsgBox.removeEventListener(Event.CLOSE, msgBoxCloseHandler);
 
                        _turn.splice(_turn.length - 1, 1);
 
                        if(_turn.length){        // в очереди еще есть сообщения
                                addToUp(_turn[_turn.length -1]);
                        } else {
                                showBg();
                        }
                }
 
                private function hideBg():void{
                        //_bluredContentContainer.filters = BG_FILTERS_ARRAY;
                        _parentContentContainer = _contentContainer.parent;
                        _contContIndexInParent  = _parentContentContainer.getChildIndex(_contentContainer);
                        _bluredContentContainer.addChild(_contentContainer);
                }
 
                private function showBg():void{
                        _parentContentContainer.addChildAt(_contentContainer, _contContIndexInParent)
                        //_contentContainer.visible = true;
                }
 
                private function addToUp(child : DisplayObject):void{
                        _msgsContainer.addChildAt(child, _msgsContainer.numChildren);
                }
 
                private function removeFromUp(child : DisplayObject):void{
                        _msgsContainer.removeChild(child);
                }
        }
}
 
internal class SingletonEnforcer {}

И чтобы не надо было самим искать картинки для линкования с img_* -- пример прикреплен. (жмякните клавишу, чтобы проверить)
В приаттаченном примере все встанет на свои места, если после возникновения глюка изменить масштаб.
И да. Открывать через браузер.
Всем заранее спасибо.


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

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