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