2011-11-17 62 views
0

我正在通过加速度计移动HSlider拇指。以下代码正常工作。但问题是,随着我不断倾斜设备,xSpeed继续增加。这意味着,当我现在以另一种方式倾斜它时,拇指不会移动一段时间 - 因为取决于我在这个初始方向上握持了多久,xSpeed一直在上升。通过加速度计约束HSlider拇指的移动

所以这个工作,但与上述缺陷:

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; 
} 
} 

应该采取什么逻辑是使这项工作?

谢谢。

+0

第一次调用这个函数时,h.value的值是多少? – shanethehat

+0

你应该跟踪所有的值,以了解正在发生什么 –

+0

...我会将var lastSpeed的声明移到if语句之外...... –

回答

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")); 
} 
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")); 
+0

谢谢,但那也不是很有效。部分问题在于一旦遇到h.minimum或h.maximum,它就会停留在那里。它不动。 – David

+0

在其他条件下,尝试将xSpeed设置为lastSpeed以外的其他值。首先尝试xSpeed = 2。另外,我刚刚在上面的代码中发现了一个错字。第一个其他人应该只检查值是否<=最小值。 – eterps

+0

其实,只需倒转速度值(有效地反转滑块的方向) – eterps