2010-01-20 59 views
-1

我编写了一个简单的XML驱动的MP3播放器。我已经使用了Sound和SoundChannel对象和方法,但是我找不到一个制作进度条的方法。Flash MP3播放器中的进度条

我不需要加载进度我需要一首歌曲进度状态栏。

canbd有人帮助我吗?

谢谢。

更新:

Theres是代码。

 
var musicReq: URLRequest; 
var thumbReq: URLRequest; 
var music:Sound = new Sound(); 
var sndC:SoundChannel; 
var currentSnd:Sound = music; 
var position:Number; 
var currentIndex:Number = 0; 
var songPaused:Boolean; 
var songStopped:Boolean; 
var lineClr:uint; 
var changeClr:Boolean; 
var xml:XML; 
var songList:XMLList; 

var loader:URLLoader = new URLLoader(); 
loader.addEventListener(Event.COMPLETE, Loaded); 

loader.load(new URLRequest("musiclist.xml")); 

var thumbHd:MovieClip = new MovieClip(); 
thumbHd.x = 50; 
thumbHd.y = 70; 
addChild(thumbHd); 

function Loaded(e:Event):void{ 
    xml = new XML(e.target.data); 
    songList = xml.song; 
    musicReq = new URLRequest(songList[0].url); 
    thumbReq = new URLRequest(songList[0].thumb); 
    music.load(musicReq); 
    sndC = music.play(); 
    title_txt.text = songList[0].title + " - " + songList[0].artist; 

    loadThumb(); 
    sndC.addEventListener(Event.SOUND_COMPLETE, nextSong); 
} 

function loadThumb():void{ 
    var thumbLoader:Loader = new Loader(); 
    thumbReq = new URLRequest(songList[currentIndex].thumb); 
    thumbLoader.load(thumbReq); 
    thumbLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, thumbLoaded); 
} 

function thumbLoaded(e:Event):void { 
    var thumb:Bitmap = (Bitmap)(e.target.content); 
    var holder:MovieClip = thumbHd; 
    holder.addChild(thumb); 
} 

prevBtn.addEventListener(MouseEvent.CLICK, prevSong); 
nextBtn.addEventListener(MouseEvent.CLICK, nextSong); 
playBtn.addEventListener(MouseEvent.CLICK, playSong); 

function prevSong(e:Event):void{ 
    if(currentIndex > 0){ 
     currentIndex--; 
    } 
    else{ 
     currentIndex = songList.length() - 1; 
    } 

    var prevReq:URLRequest = new URLRequest(songList[currentIndex].url); 
    var prevPlay:Sound = new Sound(prevReq); 
    sndC.stop(); 
    title_txt.text = songList[currentIndex].title + " - " + songList[currentIndex].artist; 
    sndC = prevPlay.play(); 
    currentSnd = prevPlay; 
    songPaused = false; 
    loadThumb(); 
    sndC.addEventListener(Event.SOUND_COMPLETE, nextSong); 
} 

function nextSong(e:Event):void { 
    if(currentIndex

而这里的长度和位置的代码。它在MovieClip中。这就是为什么我使用绝对路径来查找Sound对象。



this.addEventListener(Event.ENTER_FRAME, moveSpeaker); 

var initWidth:Number = this.SpkCone.width; 
var initHeight:Number = this.SpkCone.height; 
var rootObj:Object = root; 

function moveSpeaker(eventArgs:Event) 
{ 
    var average:Number = ((rootObj.audioPlayer_mc.sndC.leftPeak + rootObj.audioPlayer_mc.sndC.rightPeak)/2) * 10; 
// trace(average); 
// trace(initWidth + ":" + initHeight); 
    trace(rootObj.audioPlayer_mc.sndC.position + "/" + rootObj.audioPlayer_mc.music.length); 
    this.SpkCone.width = initWidth + average; 
    this.SpkCone.height = initHeight + average; 
} 


回答

2

你可以得到一个标准化的浮点值(完成的百分比)使用:SoundChannel.position/Sound.length。然后,您可以将该值用作声音播放进度指示器的标量。

的伪代码:

// -- set the x scale of the progress bar to the percent complete 
progbar.scaleX = channel.position/sound.length; 
+0

感谢杰里米,我已经试过这一点,但在lenght值总是甚至比这首歌的时候有位置值越大已完成。例如:在100%的位置:5944.308390022676长度:7392.65306122449你知道如何解决这个问题吗?谢谢。 – DeryckOE 2010-01-20 17:18:41

+0

您如何通过输入框或其他事件监控回放? – JeremyFromEarth 2010-01-20 17:24:41

+0

是的,通过ENTER_FRAME。 – DeryckOE 2010-01-20 17:30:59

0

Sound类具有“长度”属性表示的声音的长度和所述的SoundChannel具有“位置”属性,来指示当前播放的声音的位置。将这2个属性用作ProgressBar组件的数据。

+0

谢谢克里斯托夫。我已经尝试过,但即使歌曲有b,长度值也总是大于位置值een完成。 例如: 100%的位置:5944。308390022676 长度:7392.65306122449 你知道如何解决这个问题吗? 谢谢。 – DeryckOE 2010-01-20 17:16:36

+0

你确定这些属性是相同的声音?你是如何播放你的mp3文件的? – 2010-01-20 17:20:41

+0

是的,一样的。但是,我正在使用带有歌曲列表的XML。也许是有原因的。任何建议?任何选择? – DeryckOE 2010-01-20 17:22:11

0

你要听的完整事件,以及内部的设置的scaleX为1