我正在通过加速度计移动HSlider拇指。以下代码工作正常。但问题是,随着我不断倾斜设备,xSpeed继续增加。这意味着当我现在向另一个方向倾斜时,拇指不会移动一段时间 - 因为,根据我在那个初始方向倾斜的持续时间,xSpeed一直在上升。
所以这有效,但有上述缺陷:
private function readAcc(e:AccelerometerEvent):void
{
xSpeed -= e.accelerationX * 4;
myHSlider.dispatchEvent(new FlexEvent("valueCommit"));
myHSlider.value += xSpeed;
}
但我想做的是在hSlider.value ==最小值或最大值后停止递增xSpeed。听起来很简单,但是当我输入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;
}
}
使这项工作有什么逻辑?
感谢。
答案 0 :(得分:0)
添加(或减去)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"));
答案 1 :(得分:0)
好的,已经想出来并希望分享它。关键是不要设置hslider的h.value。相反,只需设置拇指的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"));
}