由于项目架构的关系,会在时间轴上加声音流,跟动画匹配,有时候会做到影片剪辑里。如果是线性的播放完全没有问题,但是遇到有播放进度条,可以跳帧,问题就出现了:播放头刚到含有声音的影片剪辑,通过调整进度条,主时间轴一下子跳过了这个影片剪辑所在的帧——导致,画面变了,但是之前的影片剪辑里的声音还在播放。。。 不谈这种方式的其他问题,就这一项,我纠结了好久。使用侦听,当播放头不在这个影片剪辑的范围时,就将影片剪辑stop,这当然不行,因为跳过了影片剪辑,它的实例名就是null了 鉴于在时间轴上的声音,没法使用SoundChannel,soundTransform里又没有关闭声音的方法 最后,灵光一闪,解决的居然很轻巧 代码创建一个影片剪辑,将需要停止的影片剪辑斌给新剪辑,然后在侦听的时候stop这个新建的影片剪辑,居然成了。。。 var newMc:MovieClip = oldMc;//时间轴上有声音的影片剪辑 //含有声音的影片剪辑在主时间轴的开始帧和结束帧 var startFrame:int = 56; var endFrame:int = 1902; addEventListener(Event.ENTERFRAME,isJumpOldMc); function isJumpOldMc(e=null) { if(this.currentFrame>endFrame||this.currentFrame<startFrame) newMc.stop(); } MovieClip类居然有soundTransform,可以用来管理时间轴上的音量、声道等等 var mc:MovieClip = new MovieClip(); var stransf:SoundTransform = mc.soundTransform; stransf.volume = 0.6; mc.soundTransform = stransf; ----------------------------------------------------------------------------- //建立声音对象。 var mySound:Sound = new Sound(); //载入声音。 mySound.load(new URLRequest("心水.mp3")); //建立 SoundChannel 对象。 var myChannel:SoundChannel; //记录播放进度的变量。 var time:uint; //播放按钮。 Btn_play.addEventListener(MouseEvent.CLICK,_play); function _play(e:MouseEvent):void { if (L_now.text=="当前状态:暂停") { myChannel = mySound.play(time); //为循环加上事件。 myChannel.addEventListener(Event.SOUND_COMPLETE,_cycleSong); L_now.text="当前状态:播放"; } } //暂停按钮。 Btn_pause.addEventListener(MouseEvent.CLICK,_pause); function _pause(e:MouseEvent):void { if (L_now.text=="当前状态:播放") { time = myChannel.position; myChannel.stop(); L_now.text="当前状态:暂停"; } } //停止按钮。 Btn_stop.addEventListener(MouseEvent.CLICK,_stop); function _stop(e:MouseEvent):void { time=0; myChannel.stop(); L_now.text="当前状态:暂停"; } //循环按钮。 Btn_cycle.addEventListener(MouseEvent.CLICK,_cycle); function _cycle(e:MouseEvent):void { if (Btn_cycle.label=="循环(关)") { Btn_cycle.label="循环(开)"; } else { Btn_cycle.label="循环(关)"; } } //真正的循环代码。 function _cycleSong(e:Event):void { if (Btn_cycle.label=="循环(开)") { myChannel = mySound.play(); //为循环加上事件。 myChannel.addEventListener(Event.SOUND_COMPLETE,_cycleSong); } else { time=0; L_now.text="当前状态:暂停"; myChannel.stop(); } }
|