Применять несколько фильтров, но не каскадно (следующий за предыдущим в массиве фильтров)

Я много искал, но безуспешно, кажется, ни у кого никогда не было этой проблемы. у меня есть 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 ответ

Применение фильтров происходит к текущим растровым данным, к которым вы применяете фильтр. Поэтому невозможно найти ваше решение с одним 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>

Этот пример выше не является вашим решением, но может дать вам шаг в правильном направлении.

Другие вопросы по тегам