Поддержка TweenLite/TweenMax для ConvolutionFilter
Я применяю фильтры к растровому изображению, используя что-то вроде:
TweenLite.to(origBitmap,0,{colorMatrixFilter:{saturation:2,brightness:3});
и это прекрасно работает.
Мне нужно как-то применить фильтр резкости к origBitmap
который я успешно достиг с помощью ConvolutionFilter
, Проблема заключается в том, что после того, как я запустил вышеуказанный вызов tweenlite, создайте фильтр свертки и примените его к origBitmap
удаляет фильтры насыщенности и яркости и сохраняет фильтр резкости
private function applyEffects(effects:Array):void
{
currentEffects = effects;
var props:Object = {};
for (var i:String in effects)
{
props[effects[i].effect] = effects[i].amount;
}
TweenLite.to(bitmap,0,{colorMatrixFilter:props});
//-- props could look like {saturation:2,brightness:3}
//-- This will sharpen the container sprite
var matrix:Array = [0, -1, 0,
-1, 5, -1,
0, -1, 0];
var conv:ConvolutionFilter = new ConvolutionFilter();
conv.matrixX = 3;
conv.matrixY = 3;
conv.matrix = matrix;
conv.divisor = 1;
bitmap.filters = [conv]; //-- this removes the above filters and just sharpens the image
}
Есть ли способ также включить ConvolutionFilter в этот вызов TweenLite выше? Я немного искал и обнаружил, что какой-то парень создал класс под названием TweenMan, который базировался вокруг вашего класса, где включен ConvolutionFilter: https://github.com/danro/tweenman-as3
1 ответ
Здесь нет ничего общего с TweenMax, так как ваш код делает ошибку. Это корректно удаляет все текущие фильтры и применяет только один:
bitmap.filters = [conv];
Поскольку свойство filters имеет значение null или Array. Чтобы добавить фильтр в список, вы используете операцию массива и повторно применяете массив:
var filters:Array = bitmap.filters;
if(!filters)
{
filters = [];
}
filters.push(conv);
bitmap.filters = filters;
РЕДАКТИРОВАТЬ: начиная с начала, я думаю, я понимаю, что вы пытаетесь сделать. Вы избегаете создания фильтра самостоятельно и позволяете TwennLite сделать это для вас, даже если вам не нужно ничего анимировать. Не делай этого, ты все усложняешь для себя. Вместо этого создайте свой фильтр таким образом:
var props:Object = {};
var colorMatrix:ColorMatrixFilter = new ColorMatrixFilter();
for (var i:String in effects)
{
colorMatrix[effects[i].effect] = effects[i].amount;
}
bitmap.filters = [colorMatrix];
//etc .... then
var filters:Array = bitmap.filters;
filters.push(conv);
bitmap.filters = filters;
Если вам нужно анимировать несколько фильтров, помните, что большинство движков анимации могут легко анимировать значения массива, поэтому вы можете просто сделать это, а затем применить эти значения массива к вашим фильтрам.