Flex 4.5 HSlider和Accelerometer?

时间:2011-10-20 04:53:07

标签: actionscript-3 flex flex4 flash-builder

我正在尝试在移动设备上使用火花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 个答案:

答案 0 :(得分:1)

  1. 看起来你正在直接移动拇指的位置。您应该改变HSlider.value属性并让组件相应地放置拇指。

  2. 只有通过用户交互(如拖动/点击)更改HSlider的值时,才会触发更改事件。听起来你可能想要监听valueCommit事件,只要HSlider的值发生变化,无论是通过编程还是通过用户交互,都会触发。