在这个问题上我真的已经用尽了我所有的知识,所以我希望我的同龄人能够帮助我。
我正在构建一个音频混音器,它有五个轨道,每个轨道有一个音量滑块和静音按钮。静音按钮而不是每个轨道的开始/停止按钮的原因是,无论何时引入样本,所有样本都将同步。该应用程序有全局开始,停止和暂停按钮,所有功能正常,但我不能得到的音量滑块和静音按钮,在一个单独的声音通道串联工作。如果我注释掉其他功能,音量滑块和静音按钮都将工作,但当两者都在播放时,只有音量滑块工作。我猜有一个冲突,因为我有两个独立的变量使用soundTransform对象/类,但也许你可以阐明这个难题?这是我的代码为一个轨道…感谢您的帮助。
var mySound1:Sound1 = new Sound1();
var myChannel1:SoundChannel = new SoundChannel();
var volumeAdjust1:SoundTransform = new SoundTransform();
volumeAdjust1.volume = 0;
mute_btn1.stop();
mute_btn1.addEventListener(MouseEvent.CLICK,togglemute_btn1);
var Mute1:Boolean = false;
function togglemute_btn1(event:MouseEvent)
{
if (Mute1)
{
mute_btn1.gotoAndStop(1);
volumeAdjust1.volume = 1;
myChannel1.soundTransform = volumeAdjust1;
Mute1 = false;
}
else
{
mute_btn1.gotoAndStop(2)
volumeAdjust1.volume = 0;
myChannel1.soundTransform = volumeAdjust1;
Mute1 = true;
}
}
/*if the section below is commented out then the mute_btn1 works fine
otherwise the volume slider functions are dominent*/
var dragging1:Boolean = false;
var mySliderLength1:uint = 300;
var boundingBox1:Rectangle = new Rectangle(0,0,0,mySliderLength1);
slider_mc1.knob_mc1.addEventListener(MouseEvent.MOUSE_DOWN, dragKnob1);
stage.addEventListener(MouseEvent.MOUSE_UP, releaseKnob1);
slider_mc1.knob_mc1.buttonMode = true;
function dragKnob1(myEvent:Event):void
{
slider_mc1.knob_mc1.startDrag(false, boundingBox1);
dragging1 = true;
slider_mc1.knob_mc1.addEventListener(Event.ENTER_FRAME, adjustVolume1);
}
function releaseKnob1(myEvent:Event):void
{
if (dragging1)
{
slider_mc1.knob_mc1.stopDrag();
dragging1 = false;
}
}
function adjustVolume1(myEvent:Event):void
{
var myVolume1:Number = slider_mc1.knob_mc1.y / mySliderLength1;
var myTransform1:SoundTransform = new SoundTransform(myVolume1);
if (myChannel1!=null)
{
myChannel1.soundTransform = myTransform1;
}
}
您应该检查您的侦听器中的Mute1
变量,如果静音,则volume=0,否则计算音量。确实,在stopDrag()
调用时删除进入帧侦听器。
function dragKnob1(myEvent:Event):void
{
slider_mc1.knob_mc1.startDrag(false, boundingBox1);
dragging1 = true;
slider_mc1.knob_mc1.addEventListener(Event.ENTER_FRAME, adjustVolume1);
}
function releaseKnob1(myEvent:Event):void
{
if (dragging1)
{
slider_mc1.knob_mc1.stopDrag();
dragging1 = false;
slider_mc1.knob_mc1.removeEventListener(Event.ENTER_FRAME, adjustVolume1);
// ^ this line added
}
}
function adjustVolume1(myEvent:Event):void
{
if (Mute1) return;
// ^ and this line added
var myVolume1:Number = slider_mc1.knob_mc1.y / mySliderLength1;
var myTransform1:SoundTransform = new SoundTransform(myVolume1);
if (myChannel1!=null)
{
myChannel1.soundTransform = myTransform1;
}
}
我相信你的问题是每次单击鼠标时都要添加Enter_Frame侦听器,但它永远不会被删除。因此,即使在你松开旋钮后,adjustVolume1函数仍然会被调用(这会打乱静音函数调用后在帧上执行的任何静音函数调用)。
那么我认为我将如何处理这个给定的当前状态是移动Enter_Frame监听器添加到dragKnob函数之外,并在adjustVolume1处理程序中检查draging1是否为真,否则只是返回。
slider_mc1.knob_mc1.addEventListener(Event.ENTER_FRAME, adjustVolume1);
function dragKnob1(myEvent:Event):void
{
...
}
function adjustVolume1(myEvent:Event):void
{
if(!dragging1)
return;
...
}