读书人

使用flex做了一个听力播放器为何暂停

发布时间: 2012-03-26 15:46:56 作者: rapoo

使用flex做了一个听力播放器,为何暂停不能用,并且多次点击播放都从头开始播放呢?重音啊,苦恼
使用flex做了一个听力播放器,为何暂停不能用,并且多次点击播放都从头开始播放呢?重音啊,苦恼

源码如下:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="707" minWidth="955" minHeight="400" >
<fx:Style>
.playStyle {
/* play button skins */
skin: Embed('images/control_play.png');
downSkin: Embed('images/control_play_blue.png');
}
.pauseStyle {
/* play button skins */
skin: Embed('images/control_pause.png');
downSkin: Embed('images/control_pause_blue.png');
}
.stopStyle {
skin: Embed('images/control_stop.png');
downSkin: Embed('images/control_stop_blue.png');
}

.soundStyle {
Skin:Embed('images/sound.gif');
downSkin:Embed('images/sound.gif');

}

.soundoffStyle {
Skin:Embed('images/soundoff.gif');
downSkin:Embed('images/soundoff.gif');

}

</fx:Style>
<mx:Panel id="pan" x="47" y="55" width="523" height="191" backgroundColor="#097DA8"
paddingTop="12" textAlign="center" title="听力播放器">

<mx:VBox width="512" height="129" paddingBottom="21" paddingLeft="50">
<mx:VBox borderStyle="solid" paddingLeft="0">
<mx:Label id="title" width="418" height="27" color="#FFFFFF"/>
<mx:Canvas id="soundWave" width="418" height="3" alpha="1.0"
click="changeWaveStyle(event)"/>
</mx:VBox>

<mx:ProgressBar id="pb" width="420" height="7" label="0%" labelPlacement="center"
maximum="100" minimum="0" mode="manual" />
<mx:HBox width="420" height="16" paddingLeft="10">
<mx:Label id="songztime_lbl" width="207" height="19" color="#FFFFFF"
fontSize="12" text="00:00" textAlign="left"/>
<mx:Label id="playtime_lbl" width="191" color="#FFFFFF" fontSize="12"
text="00:00" textAlign="right"/>
</mx:HBox>

<mx:HBox width="420" height="25" paddingLeft="10">
<mx:LinkButton id="starts" click="pl()" color="#FFFFFF" paddingTop="10" paddingLeft="10"
styleName="playStyle" toolTip="播放音乐"/>
<mx:LinkButton id="pauses" click="pa()" color="#FFFFFF" paddingTop="10"
styleName="pauseStyle" toolTip="暂停播放"/>
<mx:LinkButton id="stops" click="st()" color="#FFFFFF" paddingTop="10"
styleName="stopStyle" toolTip="停止播放"/>
<mx:LinkButton id="silence" click="ChangeSound()" color="#FFFFFF" paddingTop="10"
styleName="soundStyle" toolTip="静音" cornerRadius="6" width="20" height="20" y="1" x="141" />
<mx:HSlider id="voice" width="80" minimum="0" maximum="1" height="10"
value="0.8" change="changeVolume()" />



</mx:HBox>
</mx:VBox>


</mx:Panel>
<fx:Style>
@namespace mx "library://ns.adobe.com/flex/mx";
mx|Application
{
font-size:14;
}
</fx:Style>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->


</fx:Declarations>
<fx:Script>
<![CDATA[
import flashx.textLayout.formats.Float;

import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.events.DragEvent;
import mx.events.ListEvent;

import org.osmf.events.TimeEvent;
private var tim:Timer = new Timer(100,0);
private var wavStyle:int = -36;//控制显示波形



private var pos:Number = 0; //记录暂定的时间 然后播放从暂停位置开始播放
private var sud:Sound = new Sound() ; //声音文件, 新建 Sound 对象
private var scn:SoundChannel = new SoundChannel(); //声音通道,可对声音精确控制
private var request:URLRequest;
private var playTag:Boolean=false;


/**
* 开始播放歌曲,开始显示歌曲波形并且监听进度条事件
* */
public function pl():void{


trace("playing the position is "+pos);

tim.addEventListener(TimerEvent.TIMER,showSoundWave);
tim.start();
//playtime_lbl.text=dateformat(sud.length);
if(pos == 0)
{//var soundURL:String = root.loaderInfo.parameters["url"];
//访问 url 上的东西都用 URLRequest 了
var soundURL:String = ""http://blog.gmw.cn/UploadFiles/2010-9/152257675213.mp3";

var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest(soundURL);
try {
loader.load(request);
} catch (error:Error) {
trace("Unable to load requested document.");
}
//sud = new Sound(request);
sud.load(request);
scn = sud.play(0);
sud.addEventListener(IOErrorEvent.IO_ERROR,handleError);
pb.addEventListener(Event.ENTER_FRAME,ud);
songztime_lbl.addEventListener(Event.RENDER,stime);
playtime_lbl.addEventListener(Event.RENDER,stime);
//playTag =true;
}
else
{
sud.addEventListener(IOErrorEvent.IO_ERROR,handleError);
Alert.show(pos.toString(),"title");
scn = sud.play(pos);
//playTag =true;
playtime_lbl.addEventListener(Event.RENDER,stime);
}
}

/**
* 暂停播放
* */
public function pa():void
{
pos = scn.position;
scn.stop();

tim.reset();
trace("pauseing the position is "+pos);

}

/**
* 停止播放
* */
public function st():void
{pos = 0;
scn.stop();
tim.stop();
trace("stopping the position is "+pos);
}

/**
* 显示歌曲波形
* */
internal function showSoundWave(evt:TimerEvent):void{
var g:Graphics=soundWave.graphics;
g.clear();

var soundData:ByteArray=new ByteArray();
SoundMixer.computeSpectrum(soundData,true,0);
g.lineStyle(2,0xffffff,1);

for(var i:Number=1;i<420;i+=1){
var n:Number=soundData.readFloat();
g.lineTo(i,-36*n);
g.moveTo(i,wavStyle*n);
}
}

/**
* 改变波形样式
* */
public function changeWaveStyle(event:MouseEvent):void
{
this.wavStyle = -this.wavStyle;
}
/**
* 调节音量
* */
public function changeVolume():void{
var transform:SoundTransform = scn.soundTransform;
transform.volume = voice.value;
scn.soundTransform = transform;


}
/**
* 更新进度条信息
* */
public function ud(event:Event):void
{
var position:Number=scn.position;
var length:Number=sud.length;
var percent:Number=Math.round(position*100/length);
//trace("position is "+position +"\n" +"length is " + length + "\n" +"percent is "+percent);
if(isNaN(percent))
percent = 0;
pb.label=percent.toString()+"%";
pb.setProgress(position,length);

}
/**
* 更新音乐正在播放的时间
* */
public function stime(event:Event):void
{
var position:String=dateformat(scn.position);
songztime_lbl.text=position;
playtime_lbl.text=dateformat(sud.length);

}


public function dateformat(num:Number):String
{
var retext:String=null;
var pdate:Date=new Date(num);
var m:int=pdate.getMinutes();
var s:int=pdate.getSeconds();
if(m<10)
{
retext="0"+m.toString();
}
else
{
retext=m.toString();
}
if(s<10)
{
retext+=":0"+s.toString();
}
else
{
retext+=":"+s.toString();
}
return retext;
}
/**
* 处理IO错误
* */
public function handleError(event:IOErrorEvent):void
{
mx.controls.Alert.show("文件不存在或者已经转移,请重试。");
return;
}
]]>
</fx:Script>
</s:Application>

问题一:不知为什么暂停不能用了?
问题二:为何在当前音乐播放的时候,再次点击播放,还会重新加载新的音乐播放呢?重音啊
问题三:不知道该怎么获取到音乐的总长度了?我获取的音乐总时长竟然可以随时变化?

求救,初学flex,不熟练啊


[解决办法]
代码长懒得看,反正就是声音没卸载。把对声音的全部引用解除掉,把声音的全部监听remove掉,然后调用GC。

读书人网 >flex

热点推荐