使用Juce开发Audio Plugins (四) UI事件监听
此为老版教程,请移步新版教程:《音频开发技术/实战/进阶》
要实现事件监听,我们需要给UI组件传入一个XXXListener类的对象
为了方便,我们直接把当前的ProcessorEditor直接继承自XXXListener系列的类,然后用this把当前这个对象传递给需要设置事件监听的UI组件。
PluginEditor.h
这里我继承自SliderListener类,凡是继承自SliderListener的类可以被当做一个Slider的监听器(详细了解搜索里氏替换原则LSP)
以此类推,还有ButtonListener等其他Listener
继承这些Listener类,会有一个必须要实现的抽象函数,这个函数在该Listener绑定的UI组件被触发时调用
例如ButtonListener中的回调方法是void buttonClicked (Button* buttonThatWasClicked)
SliderListener中的回调方法是void sliderValueChanged (Slider* sliderThatWasMoved)
这些UI事件回调方法接受的参数,是哪一个UI组件被调用,例如你有两个Slider同时绑定同一个Listener,使用传入的指针参数,就能区分是哪一个Slider被触发
这个要重写的函数同样要先在.h文件中声明 并且加上override
然后要在cpp中实现这个回调函数
MyPluginEditor.cpp
1 2 3 4 5 6 7 8 9 10 11 12 | void MyPluginEditor::sliderValueChanged (Slider* sliderThatWasMoved) { if (sliderThatWasMoved == &slider1) { //使用Slider1的逻辑 } if (sliderThatWasMoved == &slider2) { //使用Slider2的逻辑 } } |
那么有了Listener监听类,有了UI事件触发的处理方法,要如何把UI组件和监听类的处理逻辑绑定起来呢?
PluginEditor.cpp
在构造方法的倒数第二行 有一句 slider1.addListener(this),这句为按钮是绑定监听类的方法
addListener可以传入一切继承自XXXListener的对象(详细了解搜索里氏替换原则LSP),传入的监听类对象就会和这个UI组件绑定
当该UI元素被触发,它会自动调用其绑定的Listener中对应的回调方法
例如Button就会调用继承自ButtonListener监听类的对象中的void buttonClicked (Button* buttonThatWasClicked)成员方法
而Slider就会调用继承自SliderListener监听类中的void sliderValueChanged (Slider* sliderThatWasMoved)成员方法
this指向的当前的对象,也就是当前这个继承自SliderListener的PluginEditor对象,它作为一个监听器被slider1滑动条绑定。
这里如果你不熟悉,你可以简单的理解传入为this就是当Slider被拖动是会执行当前文件内(ProcessorEditor.cpp)的void sliderValueChanged (Slider* sliderThatWasMoved)方法。
其他UI组件和其监听类与回调方法亦然。
最后,我们通常在PluginEditor类的析构方法中解除对事件的绑定
1 2 3 4 5 | MyPluginEditor::~MyApAudioProcessorEditor() { slider1.removeListener (this); } |
好,这一节先到这里,下一节讲解参数在Processor和Editor之间的传递。