Зависание фильтров на объекте
Вложений: 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_* -- пример прикреплен. (жмякните клавишу, чтобы проверить)
В приаттаченном примере все встанет на свои места, если после возникновения глюка изменить масштаб.
И да. Открывать через браузер.
Всем заранее спасибо.
|