0
Answered

Анимация. Повороты

evg 9 years ago in Tips and Tricks updated by Aleksandr Romanov (CTO) 6 years ago 7
Доброй ночи!

Есть задача поворачивать элемент то влево, то вправо в зависимости от нажатия кнопки слева или справа соответствнно. Планировал реализовать данную функцию при помощи анимации.

Сделал все по инструкции описанной здесь.

Код получился вот такой:
function Turn()
{
var Button1 = IR.GetItem("Page 1").GetItem("Item 2");
var Button2 = IR.GetItem("Page 1").GetItem("Item 3");
var Arrow = IR.GetItem("Page 1").GetItem("Item 1");
IR.AddListener(IR.EVENT_ITEM_PRESS,Button1,function()
{
Animation([Rotate(90)], Arrow, 500, NOT_DELAY, NOT_LOOP, LINEAR);
});

IR.AddListener(IR.EVENT_ITEM_PRESS,Button2,function()
{
Animation([Rotate(-90)], Arrow, 500, NOT_DELAY, NOT_LOOP, LINEAR);
});
}
 
Решил данный вопрос самостоятельно путем внесения небольших изменений в библиотеку анимации и некоторых доп условий в обработчик нажатия клавиш.

Возник другой вопрос.

Точность позиционирования при повороте оставляет желать лучшего. Ошибка до 2 градусов и она накапливается.
Добрый день, Евгений!

2. Вычисления в приложении, имеют небольшую погрешность, что бы этого избежать можно добавить дополнительное принудительное выставление указанного значения, отловив почти момент завершения анимации: 
Пример:
if(this.counter >= this.duration - this.step)
this.value = this.change;

Реализация:
Rotate = function(in_change){

return function(){

this.change = in_change;
this.first = 0;

return function(i){

// Принудительное выставления максимального значения, для устранения погрешности
if(this.counter >= this.duration - this.step)
this.value = this.change;

this.item[i]["Angle"] = this.value;
}
}

1. По вопросу первому, тут скорее была проблема в организации кода.
Вы выполняете подписку на нажатия элементов внутри вызова функции. Обратите внимание на то, что подписка будет происходить каждый раз, при вызове Turn. Т.е. после двух вызовов, указанные функции, будут подписаны дважды и выполнять будут дважды. Верно было бы подписать функции на событии только один раз, например при событии START.



Подписка там была дальше:
var Turn_1 = new Turn();
+1
Внес изменения. Теперь все отлично работает.
Спасибо большое!
+1
Вот что получилось. С 14й секунды
http://www.youtube.com/watch?v=Q2fpY9Yjtfc