Сброс целевых значений в составном эффекте

#apache-flex #effects

#apache-flex #эффекты

Вопрос:

Нам нужно иметь возможность обрабатывать «воспроизводимый» эффект (воспроизведение / пауза / поиск), в котором природа эффекта не может быть определена во время компиляции.

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

Вот упрощенный (насколько я мог) тестовый пример с включенным view source:

http://www.openbaseinteractive.com/_tmp/PlayableEffectTest/

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

Каков наилучший способ вручную сбросить целевые значения, учитывая, что точная природа эффекта неизвестна?

Большое спасибо за ваше время!

Редактировать

Я забыл упомянуть, что мы используем предварительный выпуск Flex 4.5.

Ответ №1:

Комментарии:

1. Это просто воспроизводит эффект в обратном порядке. Мне нужно запустить его заново и воспроизвести с самого начала.

2. @drkstr я не понял, в исходном сообщении говорилось, что вы хотели воспроизвести эффект с самого начала; только то, что вы хотели вернуть элементам их начальные значения. Использование effect.reverse() должно это сделать. Сохранение и сброс начальных значений (как указано в вашем собственном ответе) кажется жизнеспособным вариантом.

3. Я полагаю, что это было бы. Спасибо за предложение. 🙂

Ответ №2:

Ну, это немного запутанно, но я смог выполнить это, вызвав некоторые внутренние методы в эффекте для захвата начальных значений, а затем присвоил эти значения целевым объектам при сбросе.

 import mx.core.mx_internal;
use namespace mx_internal;

private var _propertyChangesArray:Array;

protected function captureStartValues(effect:Object):void
{
    effect.captureStartValues();
    _propertyChangesArray = effect.propertyChangesArray;
}

protected function reset(effect:Object):void
{
    for each(var change:PropertyChanges in _propertyChangesArray)
    {
        var target:Object = change.target;

        for(var p:String in change.start)
        {
            if(target.hasOwnProperty(p))
            {
                var startVal:* = change.start[p];
                var endVal:* = target[p];

                if(!isNaN(startVal) amp;amp; startVal != endVal)
                {
                    target[p] = startVal;
                }
            }
        }
    }

    effect.playheadTime = 0;
}
  

Я не знаю, лучший ли это способ добиться этого, но, похоже, пока он работает. Я абсолютно открыт для предложений по улучшению метода.

Приветствия!