应用多个过滤器,但不进行级联(以下过滤器数组中的前一个过滤器)

时间:2014-07-07 13:27:35

标签: flex filter effects dropshadow

我经常搜索但没有成功,似乎没有人遇到过这个问题。 我有displayObject,我想在其上应用(例如)两个过滤器:假设两个dropShadowFilter,一个inner=true,另一个inner=false。 如文档中所述,过滤器按照它们在filters数组中出现的顺序应用。因此,如果先放置外部阴影滤镜,则第二个滤镜也将应用于生成的阴影。 更改顺序并不是一个详尽的解决方案,问题仍然存在,并且应用不同的过滤器可以再次重现奇怪的效果。

我正在寻找一种方法来避免这种情况,即将过滤器全部应用于原始对象,而不是由任何其他过滤器修改

非常感谢。

下面是一段有用的快速测试代码片段。

<?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" minWidth="955" minHeight="600">
    <fx:Declarations>
        <s:DropShadowFilter id="dropShadowOuter"
                            inner="false"
                            distance="65"
                            color="#000000"
                            alpha="0.4"/>
        <s:DropShadowFilter id="dropShadowInner"
                            inner="true"
                            distance="9"
                            color="#f3f951"
                            alpha="1"/>
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.core.UIComponent;

            protected function applyFilters_clickHandler(event:MouseEvent):void
            {
                (OutIn.textDisplay as UIComponent).filters = [dropShadowOuter,dropShadowInner];
                (InOut.textDisplay as UIComponent).filters = [dropShadowInner,dropShadowOuter];
                (Out.textDisplay as UIComponent).filters = [dropShadowInner];
                (In.textDisplay as UIComponent).filters = [dropShadowOuter];
            }

        ]]>
    </fx:Script>

    <s:VGroup>
        <s:Button id="applyFilters" label="apply filters" click="applyFilters_clickHandler(event)"/>

    <s:TextArea id="OutIn" 
        text="EXAMPLE TEXT"
                width="600" height="200"
                fontFamily="Arial Black"
                fontSize="72"/>

        <s:TextArea id="InOut" text="EXAMPLE TEXT"
                width="600" height="200"
                fontFamily="Arial Black"
                fontSize="72"/>

        <s:TextArea  id="Out"
                     text="EXAMPLE TEXT"
                    width="600" height="200"
                    fontFamily="Arial Black"
                    fontSize="72"/>

        <s:TextArea  id="In"
                     text="EXAMPLE TEXT"
                    width="600" height="200"
                    fontFamily="Arial Black"
                    fontSize="72"/>



    </s:VGroup>


</s:Application>

1 个答案:

答案 0 :(得分:0)

应用过滤器会在您应用过滤器的当前位图数据上发生。因此,无法通过一个TextArea和多个过滤器找到您的解决方案。 您可以尝试在每个TextArea上使用多个TextArea和一个过滤器,并将这些textarea与一个很好的混合模式重叠。

<s:Group blendMode="multiply">

        <s:TextArea  id="Out"
                     alpha=".5"
                     filters="{[dropShadowOuter]}"
                     text="EXAMPLE TEXT"
                     width="600" height="200"
                     fontFamily="Arial Black"
                     fontSize="72"/>
        <s:TextArea  id="In"
                     alpha=".5"
                     filters="{[dropShadowInner]}"
                     text="EXAMPLE TEXT" 
                     width="600" height="200"
                     fontFamily="Arial Black"
                     fontSize="72"/>
    </s:Group>

上面的示例不是您的解决方案,但可能会为您提供正确的方向。