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

#actionscript-3 #apache-flex #flex4 #flash-builder

#actionscript-3 #apache-flex #flex4 #flash-конструктор

Вопрос:

Я пытаюсь использовать spark 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. Ползунок не работает для меня, пока вы сначала не переместите его пальцем, а затем он исчезнет с экрана. Почему init() вызывается дважды?

2. Привет, Брайан, да, спасибо — это была ошибка. Я удалил второй вызов. Странно, что компонент практически разваливается, если вы используете его с акселерометром.

3. Может быть, разбить эту демонстрацию. Не знаю, какие части работают, а какие нет. Было бы неприятно отлаживать как есть 🙂

Ответ №1:

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

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

Комментарии:

1. Кстати, я заметил, что в вашем представлении есть то, что кажется ненужным BorderContainer . Этот компонент не рекомендуется использовать в мобильных проектах и может привести к проблемам с производительностью. Смотрите это видео для получения дополнительной информации: flexponential.com/2011/10/05 /…

2. Привет, Стивен, да, я тоже это заметил и удалил. Спасибо. [Примечание: как ни странно, это было предложено старшим евангелистом Adobe Flash на Blackberry DevCon. Поди разберись!]