Ограничить движение большого пальца HSlider акселерометром - PullRequest
0 голосов
/ 17 ноября 2011

Я перемещаю большой палец HSlider через акселерометр. Следующий код работает нормально. Проблема, однако, в том, что, поскольку я продолжаю наклонять устройство, xSpeed ​​продолжает увеличиваться. Это означает, что когда я теперь наклоняю его в другую сторону, большой палец некоторое время не двигается - поскольку, в зависимости от того, как долго я держал, наклонен в этом начальном направлении, xSpeed ​​поднимался и поднимался.

Так что это работает, но с вышеупомянутым недостатком:

 private function readAcc(e:AccelerometerEvent):void
 {
    xSpeed -= e.accelerationX * 4; 
    myHSlider.dispatchEvent(new FlexEvent("valueCommit"));
    myHSlider.value += xSpeed;
 }

Но я хочу прекратить увеличивать xSpeed, если hSlider.value == минимальное или максимальное значение. Звучит просто, но когда я вставляю операторы if, они вообще не допускают движения большого пальца:

private function readA(e:AccelerometerEvent):void
{
if(h.minimum < h.value && h.maximum > h.value)
    {
    xSpeed -= e.accelerationX * 4; 
    h.dispatchEvent(new FlexEvent("valueCommit"));
    h.value += xSpeed;
    var lastSpeed:Number = xSpeed;
}
else if (h.value == h.minimum || h.value == h.maximum)
{
    xSpeed = lastSpeed;
    h.dispatchEvent(new FlexEvent("valueCommit"));
    h.value += xSpeed;
}
}

Какой должна быть логика, чтобы заставить это работать?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2011

ОК, разобрался с этим и хотел поделиться им. Ключ не должен связываться с установкой h.value hslider. Скорее, просто установите x большого пальца, и пусть значение позаботится о себе. Событие акселерометра вызывает обработчик; в этом обработчике создайте функцию moveThumb (), которая будет корректировать этот x. Затем из функции moveThumb () отправьте событие valueCommit, чтобы hslider ответил.

 private var xSpeed:Number;

 private function accUpdateHandler(e:AccelerometerEvent):void
 {
xSpeed -= e.accelerationX;
moveThumb();
 }

 private function moveThumb():void
 {
     var newX:Number = h.thumb.x + xSpeed;
     var newY:Number = h.thumb.y + ySpeed;
     if (newX < 0)
     {
         h.thumb.x = 0;
         xSpeed = 0;
     }
     else if (newX > h.width - h.thumb.width)
     {
         h.thumb.x = h.width - h.thumb.width;
         xSpeed = 0;
     }
     else
     {
         h.value += xSpeed;
     }
     h.dispatchEvent(new FlexEvent("valueCommit"));
}
0 голосов
/ 17 ноября 2011

Возможно, значение вашего ползунка превышает минимальные или максимальные пределы при добавлении (или вычитании) xSpeed.Проверьте это и вычтите, если значение слишком высокое, или добавьте, если значение слишком низкое.

// EDIT: Code modified to reflect most recent comment
if(h.minimum < h.value && h.maximum > h.value)
{
    xSpeed -= e.accelerationX * 4; 
    var lastSpeed:Number = xSpeed;

}
else if (h.value <= h.minimum )  
{
    xSpeed = 2;
}
else if ( h.value >= h.maximum )
{
    xSpeed = -2
}
h.value += xSpeed;
h.dispatchEvent(new FlexEvent("valueCommit"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...