|
|
|||||
Зависание фильтров на объекте
Сделал для приложения что-то вроде менеджера всплывающих сообщений.
Хотелось, чтобы при показе сообщения остальной фон размывался. Для этого стал засовывать все остальное в контейнер, на который вешал фильтры. При отладке в десктопном плеере или через билдер все было отлично. Но как только залил в контакт с отображением начались странности. После убирания сообщения фон все равно оставался размыленным "протираясь" курсором (кастомным) или другими движущимися объектами. Не понимаю такое поведение. Вот несколько упрощенный код менеджера и минимальное приложение для воспроизведения ситуации. Помогите понять, что я делаю не так. (если открыть закоменченные строки, все начинает, естественно, работать как надо... Но хочется без них, тк чуть меньше задержка. Да и вообще разобраться хочется) 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); } } } } 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 {} В приаттаченном примере все встанет на свои места, если после возникновения глюка изменить масштаб. И да. Открывать через браузер. Всем заранее спасибо. Последний раз редактировалось ChuwY; 02.02.2011 в 14:48. |
Часовой пояс GMT +4, время: 18:37. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|