#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:
-
Похоже, вы перемещаете положение большого пальца напрямую. Вместо этого вы должны изменить свойство HSlider.value и позволить компоненту соответствующим образом расположить большой палец.
-
Событие изменения срабатывает только в том случае, если значение HSlider изменяется с помощью взаимодействия с пользователем (например, перетаскиванием / щелчком). Похоже, вы можете захотеть прослушать событие valueCommit, которое будет срабатывать всякий раз, когда значение HSlider изменяется, будь то программно или через взаимодействие с пользователем.
Комментарии:
1. Кстати, я заметил, что в вашем представлении есть то, что кажется ненужным BorderContainer . Этот компонент не рекомендуется использовать в мобильных проектах и может привести к проблемам с производительностью. Смотрите это видео для получения дополнительной информации: flexponential.com/2011/10/05 /…
2. Привет, Стивен, да, я тоже это заметил и удалил. Спасибо. [Примечание: как ни странно, это было предложено старшим евангелистом Adobe Flash на Blackberry DevCon. Поди разберись!]