Я пытаюсь использовать искровой 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>