Flex 4.5 HSlider и акселерометр? - PullRequest
       12

Flex 4.5 HSlider и акселерометр?

0 голосов
/ 20 октября 2011

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

1 Ответ

1 голос
/ 21 октября 2011
  1. Похоже, вы перемещаете положение большого пальца напрямую.Вместо этого вы должны изменить свойство HSlider.value и позволить компоненту позиционировать большой палец соответственно.

  2. Событие изменения срабатывает только в том случае, если значение HSlider изменяется посредством взаимодействия с пользователем (напримерперетащить / щелкнуть).Похоже, вы захотите прослушать событие valueCommit, которое будет срабатывать всякий раз, когда значение HSlider изменяется, программно или через взаимодействие с пользователем.

...