我的笔记

灵感、随想与新技术
27 4月 2017

使用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之间的传递。

 

上海外滩 – StudioEIM // MapleStory
  1. 上海外滩 – StudioEIM // MapleStory
  2. 神木村 – StudioEIM // MapleStory
  3. MapleStory – StudioEIM // MapleStory
  4. Pantheon – StudioEIM // MapleStory
  5. 逐梦飞翔 – StudioEIM // MapleStory
  6. 魔法密林 – StudioEIM // MapleStory