我正在尝试在移动设备上使用火花HSlider。为了响应加速度计,我可以让拇指移动得很好。但有两个问题:
1)当您向任一方向倾斜时,拇指会从屏幕末端飞出。我在下面输入代码试图阻止它,但它不起作用。 2)我有一个小针头应该跟随拇指的位置,即它指向它。当我拖动拇指时 - 当变化事件发生时 - 但是当加速度计使其移动时,这种方法工作正常。我想(不确定)如果我可以强制改变事件来解决这个问题呢?
编辑:跟踪语句显示当加速度计使拇指移动时,h.value不会改变。我还删除了对init()的重复调用。
代码:
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView" creationComplete="init()">
<fx:Script>
<![CDATA[
import flash.sensors.Accelerometer;
import mx.events.FlexEvent;
public var a:Accelerometer = new Accelerometer();
private var xSpeed:Number = 0;
private var newX:Number = 0;
private function init():void
{
this.addEventListener( Event.ADDED_TO_STAGE , addedToStageHandler );
}
private function addedToStageHandler(e:Event):void
{
h.value = h.minimum;
needle.rotationZ = h.value + 180;
if(Accelerometer.isSupported)
{
a.addEventListener(AccelerometerEvent.UPDATE, readA);
stage.autoOrients = false;
}
}
private function readA(e:AccelerometerEvent):void
{
xSpeed -= e.accelerationX * 5;
newX = h.thumb.x + xSpeed;
if(h.thumb.x < 0 )
{
newX = 0;
xSpeed = 0;
}
else if (newX > stage.stageWidth - h.thumb.width) //(newX > stage.stageWidth - RADIUS)
{
newX = stage.stageWidth - h.thumb.width;
xSpeed = 0;
}
else
{
newX += xSpeed
}
h.thumb.x += xSpeed;
trace("thumb.x = " + h.thumb.x);
needle.rotationZ = h.value + 180;
trace("h.value = " + h.value);
trace("needle.rotationZ = " + needle.rotationZ);
}
protected function h_changeHandler(event:Event):void
{
// TODO Auto-generated method stub
needle.rotationZ = h.value + 180;
trace(needle.rotationZ);
}
]]>
</fx:Script>
<s:HSlider change="h_changeHandler(event)" minimum="-54" maximum="54" id="h" width="300" x="158" y="74"/>
<s:BorderContainer x="158" y="200" width="300" height="1">
<s:Rect id="needle" x="150" y="0" width="2" height="100" rotation="180">
<s:fill>
<s:SolidColor color="#FF0000"/>
</s:fill>
</s:Rect>
</s:BorderContainer>
</s:View>
答案 0 :(得分:1)
看起来你正在直接移动拇指的位置。您应该改变HSlider.value属性并让组件相应地放置拇指。
只有通过用户交互(如拖动/点击)更改HSlider的值时,才会触发更改事件。听起来你可能想要监听valueCommit事件,只要HSlider的值发生变化,无论是通过编程还是通过用户交互,都会触发。