我使用HSlider实现单拇指滑块控件。拇指位置由计时器更新。但是,用户还可以通过单击滑块轨道中的位置或拖动拇指来更新拇指位置。
根据Flex文档判断,我认为我需要做的就是为change事件编写一个处理程序。 docs说:
更改事件事件对象类型: mx.events.SliderEvent属性 SliderEvent.type = mx.events.SliderEvent.CHANGE
滑块更改时调度 由鼠标或键盘引起的值 相互作用。
我编写了如下代码:
<mx:HSlider thumbPress="handleThumbPress(event)" change="handleUserChange(event)"
showTrackHighlight="true" buttonMode="true" useHandCursor="true" minimum="0"
maximum="{_max}" snapInterval="1" enabled="true" width="100%" id="mySlider"
liveDragging="false" showDataTip="true" verticalCenter="0" horizontalCenter="0"
trackSkin="{SliderTrack}" trackHighlightSkin="{TrackHighlightConfigurable}"
sliderThumbClass="{MySliderThumb}" thumbSkin="@Embed('../imgempty.png')"
dataTipFormatFunction="dataToolTipFormat"/>
我观察到的是,只要我的计时器设置了滑块的值,我的更改处理程序(仅应该响应用户交互而被调用)会一直调用。计时器代码将值设置为:
private function updateValue( newValue : Number ) : void
{
mySlider.value = newValue;
}
我犯了一个明显的错误吗?有没有更好的方法来区分Flex Slider的用户与程序化更改?
感谢。
-Raj
答案 0 :(得分:1)
如果以编程方式更改值,则不会触发更改事件。当您更改滑块的值超出滑块的最小值或最大值时,将触发事件。如果更改滑块的最小值或最大值,也会触发事件。这是在您的代码中发生的吗?
答案 1 :(得分:0)
当您以编程方式设置值时,您可以放置一个布尔包装:
private var inputByUser:Boolean = false;
private function updateValue( newValue : Number ) : void
{
if (!inputByUser)
mySlider.value = newValue;
}
我不知道你的确切代码所以我无法明确地解决它,但是我会做的就是这些。您可以在更改处理程序中设置inputByUser
,如下所示:
private function changeHandler() : void
{
inputByUser = true;
updateValue(mySlider.value + 10); // however you're doing it
inputByUser = false;
}
希望有所帮助, 兰斯