Поддержка 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;

Если вам нужно анимировать несколько фильтров, помните, что большинство движков анимации могут легко анимировать значения массива, поэтому вы можете просто сделать это, а затем применить эти значения массива к вашим фильтрам.

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