Flex Slider:如何区分程序化与用户变化

时间:2010-03-06 20:28:23

标签: flex slider

我使用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

2 个答案:

答案 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;
}

希望有所帮助, 兰斯