Flex 3 - 使用掩码和过滤器时检索鼠标事件的问题

时间:2011-04-06 15:03:19

标签: flex events filter mask

这是我正在研究的组件:

enter image description here

这是组件的类:

public class PromoPanel extends Canvas
{
    private var corner:PromoCorner;
    private var text:Text;
    private var roundedMask:Sprite;
    private var cornerUpdated:Boolean = false;
    private var textUpdated:Boolean = false;

    private var container:Canvas;

    public function PromoPanel()
    {
        super();


        // Defining corner's properties
        corner.addEventListener(MouseEvent.Roll_Over, objectHandler);
        corner.addEventListener(MouseEvent.Roll_Out, objectHandler); 

        // Defining text's properties

        roundedMask = new Sprite;
        roundedMask.mouseChildren = false;
        roundedMask.mouseEnabled = false

        container = new Canvas; 
        container.percentWidth = 100; 
        container.minHeight = 100;
        container.maxHeight = 345;
        container.setStyle('backgroundColor', 0xffffff);
        container.addChild(corner);
        container.addChild(text);  
        container.horizontalScrollPolicy = 'off'; 
        this.addChild(container);
    }

    public function update():void{
        var s:String = 'blabla'; 

        text.addEventListener(FlexEvent.UPDATE_COMPLETE, updateHandler);
        text.text = s;

        corner.addEventListener(MyEvent.CORNER_UPDATED, updateHandler);
        corner.build();
    }

    private function updateHandler(e:Event):void{
        switch(e.type){
            case MyEvent.CORNER_UPDATED:
                cornerUpdated = true;
                corner.removeEventListener(MyEvent.CORNER_UPDATED, updateHandler);
                break;
            case FlexEvent.UPDATE_COMPLETE:
                textUpdated = true;
                text.removeEventListener(FlexEvent.UPDATE_COMPLETE, updateHandler);
                break;
        }

        if(cornerUpdated && textUpdated){
                roundedMask.graphics.clear();
                roundedMask.graphics.beginFill(0xFFFFFF);
                roundedMask.graphics.drawRoundRect(0, 0, container.width, container.height, 20, 20);
                roundedMask.graphics.endFill();  
                this.mask = roundedMask;  

                dispatchEvent(new MyEvent(MyEvent.PROMO_UPDATED));
            } 
        var glow:DropShadowFilter = new DropShadowFilter(0,0,0x2E2E2E,0.6,10,10,0.5,1);
        this.filters = [glow]; 
    }

    private function objectHandler(e:Event):void{
        switch(e.type){
            case MouseEvent.ROLL_OUT:
                trace('out' + mouseX + '/' + mouseY);
                break;
            case MouseEvent.ROLL_OVER:
                trace('on' + mouseX + '/' + mouseY);
                break;
        }
    }       
...
}

更详细的理解:角是带有(i)和'Promotion'的黑角,文本是一些随机文本,可以显示在白色剩余空间中,容器包含角和文本,最后这个类包含容器!

我需要做什么?
我需要从角落检索事件mouseevent.rollover / rollout。

出了什么问题?  1.当我将面具放在容器(container.rawchildren.addchildren + container.mask = mask)和容器上的dropshacefilter(container.filters = [glow])时,我无法检测鼠标事件。
 2.当我将面具放在promopanel(this.rawchildren.addchildren + this.mask = mask)和promopanel上的dropshafilter(this.filters = [glow])时,我无法检测到鼠标事件。
 3.当我将面罩放在一个组件中而过滤器放在另一个组件中时,它也不起作用  4.如果我取下面膜或过滤器,它的作用!但我需要他们两个......

那么,有没有人知道如何使这项工作?我一直在试图寻找过滤器,掩码和鼠标事件的问题,但没有找到任何可以启发这个问题的东西......

任何事情都会有所帮助,如果事情不够清楚,可随意提问。

THX!
问候,
BS_C3

1 个答案:

答案 0 :(得分:1)

嗯,我觉得有点回答我自己的问题:) 我确信我做过的组合(肯定不会)有效:如果我将面具放在容器上并将过滤器放在promopanel上,它就可以工作....

经过一番思考,这是有道理的 我注意到,将掩码和过滤器放在同一个组件中,不知何故,使它对mouseevents充耳不闻。但是,当只使用一个或另一个一切正常 但是,将面具放在promopanel上并且容器中的过滤器不起作用。而且,这样,掩码会隐藏过滤器(我需要!) 将掩码放在没有过滤器的容器上为我工作,听众可以接收鼠标事件。然后将过滤器添加到promopanel并没有让容器听到角落的事件...

希望这可能有助于某人:) 问候。
BS_C3