Flex HSlider使用滑块轨道拖动

时间:2010-01-15 03:19:36

标签: flex

我是一名Flex / Flash新手,我正在尝试创建一个简单的音乐播放器,其中包含播放/暂停按钮和HSlider,用于显示使用自定义SliderThumbClass播放时歌曲的位置。我想让用户拖放幻灯片或点击滑块来改变当前播放歌曲的位置。

使用下面的代码,如果我使用sliderThumb来改变当前正在播放的歌曲的位置,那么效果很好。但是如果我直接点击幻灯片向前/向后跳,当前位置不会移动并且当前位置会闪烁一些,但它会跳回到原来的状态并继续播放该歌曲。如果我处于暂停状态,这确实有效。

正如预期的那样,当用户点击sliderTrack时,不会触发thumbDrag / Press / Release事件 - 我应该订阅哪些事件来处理这种情况?

由于

<mx:Canvas>

<mx:Script>
<![CDATA[
...
...

private function onMusicPlay():void 
{
   ... 
   this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
   ...
}

private function onMusicPause():void 
{
   ... 
   this.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
   ...
}
//Invoked when the user changes the position of the slider using the thumb. It
// calculates the new position where the song should start playing.
private function onThumbDrag(event:Event):void
{
    // if a song is loaded and we have the handles to it's sound and channel
    // objects, allow the scrubber to drag and update state
    if((_currentSong != null) && (_currentChannel != null))
    {
        _isDragging = true;
        _currentSongLength = _currentSong.length;
        _currentChannel.stop();
        var playhead:Number = scrubSlider.value *.01;
        _currentChannel = this.createChannel(_currentSong, (playhead * _currentSongLength));

    }
}

    //Calculates the time remaining on the current song
private function onEnterFrame(event:Event):void
{
    // only calculate intervals if the user isn't dragging
    // the length scrubber of the song, and if the song is playing
    if(!_isDragging && !_isPaused)
    {
        scrubSlider.getThumbAt(0).x = ((_currentChannel.position / _currentSong.length) * scrubSlider.width);
        var dtPosition : Date = new Date( _currentSong.length - _currentChannel.position);
        _nSongPosition.text = _timeFormatter.format( dtPosition );      
    }

]]>
</mx:Script>

    <mx:Image id="_pauseIcon" x="0" y="0" visible="true" click="pause()" source="@Embed('../icons/pause.png')"/>
    <mx:Image id="_playIcon" x="0" y="0" visible="false" click="play(false)" source="@Embed('../icons/play.png')"/>

    <mx:HSlider x="75" y="10" width="527" id="scrubSlider"
        sliderThumbClass="components.LargeSliderThumb"
        minimum="0" maximum="100" 
        liveDragging="true"
        showDataTip="false"
        thumbDrag="onThumbDrag(event)"            
        thumbPress="{_isDragging=true}" 
        thumbRelease="{_isDragging=false}"
        thumbDownSkin="@Embed('../icons/sliderThumbIcon.png')"
        thumbOverSkin="@Embed('../icons/sliderThumbIcon.png')" 
        thumbUpSkin="@Embed('../icons/sliderThumbIcon.png')" 
        trackSkin="@Embed('../icons/sliderTrack.png')" />
    <mx:Text id="_nSongPosition" x="610" y="10" width="69" height="29" text="" color="#000000" fontWeight="bold" fontSize="18"/>

</mx:Canvas>

1 个答案:

答案 0 :(得分:-1)

您的问题是您可能有一个事件监听器正在更新拖动事件中歌曲中的位置,但您没有对click事件应用相同的逻辑。 (不能确定没有更多的代码).....但这会导致你的拇指跳跃,因为它是点击...然后它会跳回来,因为它更新为歌曲播放