Actionscript 3 Flex 4-添加动态透明遮罩

Actionscript 3 Flex 4-添加动态透明遮罩,actionscript-3,flex4,masking,Actionscript 3,Flex4,Masking,我试图在flex中实现的是一个简单的屏蔽,但我没有正确地使用它或正确的方法。我甚至不确定仅仅使用掩蔽方法是否可行 我需要遮罩完整的mc,并允许用户只查看一个特定的矩形点 我使用下面的代码完成了它(与原始代码略有不同) 上面的代码创建了一个100x100的矩形,并将其作为遮罩应用于另一个movieclip对象 这很好,这里我想稍微改变掩蔽的正常行为。这是通过使遮罩区域(不可访问区域)透明,而不是完全隐藏它 可能吗 更新: 根据Baris Uskli的建议添加完整的修改过的flex代码: MaskV

我试图在flex中实现的是一个简单的屏蔽,但我没有正确地使用它或正确的方法。我甚至不确定仅仅使用掩蔽方法是否可行

我需要遮罩完整的mc,并允许用户只查看一个特定的矩形点

我使用下面的代码完成了它(与原始代码略有不同)

上面的代码创建了一个100x100的矩形,并将其作为遮罩应用于另一个movieclip对象

这很好,这里我想稍微改变掩蔽的正常行为。这是通过使遮罩区域(不可访问区域)透明,而不是完全隐藏它

可能吗

更新

根据Baris Uskli的建议添加完整的修改过的flex代码:

MaskView.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" left="0" top="0" width="100%" height="100%" creationComplete="showMask()"
         blendMode="layer">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <!--<s:Rect width="100%" height="100%">
        <s:fill>
            <s:SolidColor color="0x00aabb" alpha="0.5" />
        </s:fill>
    </s:Rect>-->
    <fx:Script>
        <![CDATA[
            import mx.core.UIComponent;

            //public static var app:Object;
            //private var
            public var conf:LightBoxConfiguration;

            public function showMask():void{

                this.graphics.beginFill(0x000000,0.6);
                this.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
                this.graphics.endFill();

                var uc:UIComponent = new UIComponent();
                uc.mouseEnabled = false;

                var g:Graphics = uc.graphics;

                g.beginFill(0xff000,0.5);

                if (conf.shape == "box"){

                    uc.width = conf.width;
                    uc.height = conf.height;
                    //TODO:need to fix this
                    g.drawRect(0,0,conf.width,conf.height);

                }else{

                    uc.width = conf.radius*2;
                    uc.height = conf.radius*2;

                    g.drawCircle(0,0,conf.radius);
                }
                g.endFill();

                uc.x = conf.x;
                uc.y = conf.y;
                uc.blendMode = BlendMode.ERASE;
                this.addElement(uc);
            }
        ]]>
    </fx:Script>
</s:Group>

这是给预期的效果,但不幸的是,我无法点击通过矩形区域。我已将mouseEnabled设置为false;但它也不起作用。我想我离实现它还有几步之遥。

使用BlendModes是可能的。下面是一些代码,绘制一个全屏透明精灵,并在其中遮罩一个矩形区域

private function mask():void
{
   this.graphics.beginFill(0x000000, 0.6);
   this.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
   this.graphics.endFill();

   var maskSprite:Sprite = new Sprite();
   maskSprite.graphics.beginFill(0xffffff, 1);
   maskSprite.graphics.drawRect(x,y,width,height);
   maskSprite.graphics.endFill();

   addChild(maskSprite);

   this.blendMode = BlendMode.LAYER;
   maskSprite.blendMode = BlendMode.ERASE;
}
希望有帮助

编辑:一些巫术只使面具区域可点击,并不完美,但可能有人可以改进。你可以将整个东西粘贴到一个空的Flex4应用程序中,并尝试通过遮罩或灰色区域单击按钮,遮罩区域将起作用

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
           xmlns:s="library://ns.adobe.com/flex/spark"
           xmlns:mx="library://ns.adobe.com/flex/mx"
           creationComplete="showMask()"
           addedToStage="onAddedToStage()"
           >

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<s:Button label="test" x="140" y="120" click="onButtonClicked(event)"></s:Button>

<s:Group id="maskGroup" blendMode="layer"  width="800" height="600" ></s:Group>

<fx:Script>
    <![CDATA[
        import flash.display.DisplayObject;
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        import mx.controls.Alert;
        import mx.core.UIComponent;

        private var uc:UIComponent = new UIComponent();

        private function onAddedToStage():void
        {
            this.addEventListener(MouseEvent.CLICK, onMouseClicked, true);
        }

        private function onButtonClicked(e:MouseEvent):void
        {
            Alert.show("clicked button");
        }

        private function onMouseClicked(e:MouseEvent):void 
        {
            var objects:Array = getObjectsUnderPoint(new Point(stage.mouseX, stage.mouseY));
            var clickedInMask:Boolean = false;
            for each (var dp:DisplayObject in objects) 
            {
                if (dp == uc)
                {
                    clickedInMask = true;
                    break;
                }
            }               
            if(!clickedInMask)
                e.stopImmediatePropagation();

        }

        private function showMask():void
        {
            maskGroup.mouseEnabled = false;
            maskGroup.mouseChildren = false;


            var sp:Sprite = new Sprite();
            sp.graphics.clear();
            sp.graphics.beginFill(0x000000,0.6);
            sp.graphics.drawRect(0,0,800,600);
            sp.graphics.endFill();

            var spC:UIComponent =  new UIComponent();
            spC.addChild(sp);
            maskGroup.addElement(spC);

            uc.x = 100;
            uc.y = 100;
            maskGroup.addElement(uc);

            var g:Graphics = uc.graphics;

            g.beginFill(0xffffff,1);

            g.drawRect(0,0,100,100);

            g.endFill();                

            uc.blendMode = BlendMode.ERASE;

        }
    ]]>
</fx:Script>


使用BlendModes是可能的。下面是一些代码,绘制一个全屏透明精灵,并在其中遮罩一个矩形区域

private function mask():void
{
   this.graphics.beginFill(0x000000, 0.6);
   this.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
   this.graphics.endFill();

   var maskSprite:Sprite = new Sprite();
   maskSprite.graphics.beginFill(0xffffff, 1);
   maskSprite.graphics.drawRect(x,y,width,height);
   maskSprite.graphics.endFill();

   addChild(maskSprite);

   this.blendMode = BlendMode.LAYER;
   maskSprite.blendMode = BlendMode.ERASE;
}
希望有帮助

编辑:一些巫术只使面具区域可点击,并不完美,但可能有人可以改进。你可以将整个东西粘贴到一个空的Flex4应用程序中,并尝试通过遮罩或灰色区域单击按钮,遮罩区域将起作用

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
           xmlns:s="library://ns.adobe.com/flex/spark"
           xmlns:mx="library://ns.adobe.com/flex/mx"
           creationComplete="showMask()"
           addedToStage="onAddedToStage()"
           >

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<s:Button label="test" x="140" y="120" click="onButtonClicked(event)"></s:Button>

<s:Group id="maskGroup" blendMode="layer"  width="800" height="600" ></s:Group>

<fx:Script>
    <![CDATA[
        import flash.display.DisplayObject;
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        import mx.controls.Alert;
        import mx.core.UIComponent;

        private var uc:UIComponent = new UIComponent();

        private function onAddedToStage():void
        {
            this.addEventListener(MouseEvent.CLICK, onMouseClicked, true);
        }

        private function onButtonClicked(e:MouseEvent):void
        {
            Alert.show("clicked button");
        }

        private function onMouseClicked(e:MouseEvent):void 
        {
            var objects:Array = getObjectsUnderPoint(new Point(stage.mouseX, stage.mouseY));
            var clickedInMask:Boolean = false;
            for each (var dp:DisplayObject in objects) 
            {
                if (dp == uc)
                {
                    clickedInMask = true;
                    break;
                }
            }               
            if(!clickedInMask)
                e.stopImmediatePropagation();

        }

        private function showMask():void
        {
            maskGroup.mouseEnabled = false;
            maskGroup.mouseChildren = false;


            var sp:Sprite = new Sprite();
            sp.graphics.clear();
            sp.graphics.beginFill(0x000000,0.6);
            sp.graphics.drawRect(0,0,800,600);
            sp.graphics.endFill();

            var spC:UIComponent =  new UIComponent();
            spC.addChild(sp);
            maskGroup.addElement(spC);

            uc.x = 100;
            uc.y = 100;
            maskGroup.addElement(uc);

            var g:Graphics = uc.graphics;

            g.beginFill(0xffffff,1);

            g.drawRect(0,0,100,100);

            g.endFill();                

            uc.blendMode = BlendMode.ERASE;

        }
    ]]>
</fx:Script>


非常感谢。这正是我想要的。不幸的是,我无法点击通过矩形孔(遮罩)。我已经将mouseEnabled设置为false,允许它忽略点击,但它不工作。我添加了最初使用as3为flex编写的完整代码。请提供帮助。如果将mouseEnabled设置为false,则不会调度任何鼠标事件,您可能希望捕获精灵上的所有鼠标单击,然后按事件停止不在矩形区域中的鼠标单击。stopImmediatePropagation()我实际上想要相同的掩蔽行为,但我需要用透明颜色显示箭头。我原以为如果我禁用MaskPrites的MouseeEvents,它会单击下面的对象,但事实并非如此。嗯,也许可以尝试在MaskView上设置MouseeEnabled和mouseChildren false,但不确定这是否会帮到你。不幸的是,使每件事都可单击使MaskPrites的概念仅用于突出显示区域:(我尝试了更多的mouseenable和disable的组合,但都没有成功:(非常感谢。这正是我想要的。不幸的是,我无法点击矩形孔(遮罩)。我已将MouseeEnabled设置为false,以允许它忽略单击,但它不起作用。我已添加了最初使用as3为flex编写的完整代码。您能提供帮助吗?如果将MouseeEnabled设置为false,则不会调度任何鼠标事件,您可能希望捕获精灵上的所有鼠标单击,然后停止那些不可用的事件的矩形区域中的t。stopImmediatePropagation()事实上,我想要相同的遮罩行为,除了我需要用透明的颜色显示sourrounding。我希望如果我禁用maskSprites的mouseevents,那么它将单击下面的对象,但事实并非如此。嗯,也许可以尝试在MaskView上设置mouseEnabled和mouseChildren false,但不确定这是否会对您有所帮助。不幸的是自然地,使每一件事都可点击使遮罩的概念仅用于突出显示区域:(我尝试了更多的mouseenable和disable组合,但没有一个有效:(