跳转到主要内容

自定义触发条件和操作

通过TouchGFX Designer,您可以自己定义具有触发条件和操作的交互组件。 您应用中的每个界面都可以包含操作集合(这些是C++中的简单void方法),您可以通过TouchGFX Designer或者在代码中来调用这些操作,并且自定义容器也可以包含可在应用中得到响应的自定义触发条件(相当于C++中的回调)。 在本文中,我们将详细介绍此功能,以探索使用它创建更简洁、动态的TouchGFX应用。

自定义触发条件

自定义容器也能够创建自定义触发条件。 它们以C++回调的形式生成,可在交互系统或用户代码中被激发或对此做出响应。

添加自定义触发条件

通过自定义容器的属性选项卡添加自定义触发条件,方法是点击下图中突出显示的触发条件部分中的“+”按钮。

添加自定义触发条件

在创建自定义触发条件后,会有更多选项可供使用,如下图所示。

编辑自定义触发条件

名称
在此指定的名称将在交互系统内部和生成的代码文件中的引用,如下面的代码示例所示:

CustomContainer1Base.hpp
class CustomContainer1Base : public touchgfx::Container
{
public:
CustomContainer1Base();
virtual ~CustomContainer1Base() {}
virtual void initialize();

/*
* Custom Trigger Callback Setters
*/
void setTrigger1Callback(touchgfx::GenericCallback<>& callback)
{
this->trigger1Callback = &callback;
}

protected:
FrontendApplication& application() {
return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());
}

/*
* Custom Trigger Emitters
*/
virtual void emitTrigger1Callback()
{
if (trigger1Callback && trigger1Callback->isValid())
{
this->trigger1Callback->execute();
}
}

private:

/*
* Custom Trigger Callback Declarations
*/
touchgfx::GenericCallback<>* trigger1Callback;

};
CustomContainer1Base.cpp
CustomContainer1Base::CustomContainer1Base() :
trigger1Callback(0)
{
setWidth(250);
setHeight(250);
}

void CustomContainer1Base::initialize()
{

}

说明
此处写入的文本将用在交互系统中,在交互系统中选中触发条件时,将鼠标光标悬停在触发条件上可显示此文本。 如果没有指定说明,将创建标准说明,如Emitting Custom Triggers from Interactions一节中所示。

类型
启用“类型”将能创建触发条件,触发条件可返回给定类型的值。 类型既可以从列表中选择,也可以手动输入。 下面显示的是当选择bool类型时生成的代码。

CustomContainer1Base.hpp
class CustomContainer1Base : public touchgfx::Container
{
public:
CustomContainer1Base();
virtual ~CustomContainer1Base() {}
virtual void initialize();

/*
* Custom Trigger Callback Setters
*/
void setTrigger1Callback(touchgfx::GenericCallback<bool>& callback)
{
this->trigger1Callback = &callback;
}

protected:
FrontendApplication& application() {
return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());
}

/*
* Custom Trigger Emitters
*/
virtual void emitTrigger1Callback(bool value)
{
if (trigger1Callback && trigger1Callback->isValid())
{
this->trigger1Callback->execute(value);
}
}

private:

/*
* Custom Trigger Callback Declarations
*/
touchgfx::GenericCallback<bool>* trigger1Callback;

};

从交互系统发送自定义触发条件

可使用交互系统发送自定义触发条件。 只需转至拥有自定义触发条件的自定义容器的“交互”选项卡,创建新的交互并选择“自定义触发条件”,如下图所示。

从交互系统发送自定义触发条件

如上图所示,在点击已添加到自定义容器的按钮时,将发送自定义触发条件。

如果自定义触发条件的类型已经使能,它的值或者变量必须被指定,如下图所示,类型被指定为bool类型。

为从交互系统发送的自定义触发条件指定参数

从用户代码发送自定义触发条件

也可以从继承生成的自定义容器的用户代码类文件发送自定义触发条件。 在生成的自定义容器中,以下为名为“trigger1”的自定义触发条件的生成代码。

CustomContainer1Base.hpp
virtual void emitTrigger1Callback(bool value)
{
if (trigger1Callback && trigger1Callback->isValid())
{
this->trigger1Callback->execute(value);
}
}

此函数可在继承自它的用户代码类文件中进行重写或调用。

从交互系统响应自定义触发条件

如果向界面添加了具有自定义触发条件的自定义容器,可将自定义触发条件用作界面上交互系统的触发条件,如下图所示。

当选择自定义触发条件作为交互的“触发条件”时,其命名模式为:<Custom Container Name><Custom Trigger name>发生

在交互系统上选择自定义触发条件作为触发条件

如果有多个相同地包含自定义触发条件自定义容器组件,在选择“触发条件”后,需要选择相应的组件。 但是,如果只有一个组件,它会被自动填入。

从用户代码响应自定义触发条件

可以通过在用户代码中应用回调函数来对自定义触发条件做出响应,如下列代码示例,在自定义容器中添加名为“trigger1”的自定义触发条件的代码添加方法。 在继承自界面的用户代码类文件中,添加了下列高亮显示行来实现回调/自定义触发条件。

Screen1View.hpp
class Screen1View : public Screen1ViewBase
{
public:
Screen1View();
virtual ~Screen1View() {}
virtual void setupScreen();
virtual void tearDownScreen();

private:
/*
* Callback Declarations
*/
touchgfx::Callback<Screen1View> customContainer1Trigger1Callback;

/*
* Callback Handler Declarations
*/
void customContainer1Trigger1CallbackHandler();
};

Screen1View.cpp
#include <gui/screen1_screen/Screen1View.hpp>

Screen1View::Screen1View():
customContainer1Trigger1Callback(this, &Screen1View::customContainer1Trigger1CallbackHandler)
{
customContainer1.setTrigger1Callback(customContainer1Trigger1Callback);
}

void Screen1View::setupScreen()
{
Screen1ViewBase::setupScreen();
}

void Screen1View::tearDownScreen()
{
Screen1ViewBase::tearDownScreen();
}

void Screen1View::customContainer1Trigger1CallbackHandler()
{
//Your code here.
}

自定义操作

界面和自定义容器能够创建自定义操作。 它们以C++虚函数的方法形式生成,可从交互系统或用户代码执行。 自定义操作的实现和行为既可以在交互系统配置,也可以通过在用户代码类文件中重写生成的C++方法进行配置。

添加自定义操作

通过界面或自定义容器的属性选项卡添加自定义触发条件,方法是点击下图中突出显示的ACTIONS部分中的“+”按钮。

添加自定义操作

在创建自定义操作后,会有更多选项可供使用,如下图所示。

编辑自定义操作

名称
在此指定的名称将在交互系统和生成的代码文件中的进一步引用,如下面的代码示例所示:

CustomContainer1Base.hpp
class CustomContainer1Base : public touchgfx::Container
{
public:
CustomContainer1Base();
virtual ~CustomContainer1Base() {}
virtual void initialize();

/*
* Custom Actions
*/
virtual void action1();

protected:
FrontendApplication& application() {
return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());
}

private:

};
CustomContainer1Base.cpp
CustomContainer1Base::CustomContainer1Base()
{
setWidth(250);
setHeight(250);
}

void CustomContainer1Base::initialize()
{

}

void CustomContainer1Base::action1()
{

}

说明
此处写入的文本将用在交互系统中,在交互系统中选中操作时,将鼠标光标悬停在操作上可显示此文本。 如果没有指定说明,将按照以下模式创建标准说明,如从交互系统调用自定义操作一节中所示:在<Screen or Custom Container Name>上调用<Name>

类型
启用“类型”将能创建操作,操作需要给定类型的参数。 类型既可以从列表中选择,也可以手动输入。 下面显示的是当选择bool类型时生成的代码。

CustomContainer1Base.hpp
/*
* Custom Actions
*/
virtual void action1(bool value);
CustomContainer1Base.cpp
void CustomContainer1Base::action1(bool value)
{

}

从交互系统调用自定义操作

在创建自定义操作后,可以从交互系统内部执行操作。 如果在自定义容器上创建操作并将自定义容器添加到界面,则可以从界面“交互”选项卡执行操作,如下图所示。

从“交互”选项卡执行自定义操作

在选择操作后,如果有同一自定义容器的多个组件,则需要选择组件。 但是,如果只有一个组件,它会被自动填入。

如果自定义操作有启用的类型,则必须如下图所示指定参数值或变量,其中已将“类型”指定为bool

为从交互系统执行的自定义操作指定参数

从用户代码调用自定义操作

也可以从用户代码直接调用自定义操作。 在下面的代码示例中,创建了一个自定义容器,它具有名为“action1”的自定义操作。 通过添加以下代码将自定义容器添加到界面上。

Screen1ViewBase.cpp
Screen1ViewBase::Screen1ViewBase()
{

customContainer11.setXY(50, 11);

add(customContainer11);
}

void Screen1ViewBase::setupScreen()
{
customContainer11.initialize();
}

可在用户代码类文件Screen1View(继承自Screen1ViewBase)调用自定义操作“action1”,如下文所示。

Screen1View.hpp
Screen1View::Screen1View()
{
customContainer11.action1();
}

void Screen1View::setupScreen()
{
Screen1ViewBase::setupScreen();
}

void Screen1View::tearDownScreen()
{
Screen1ViewBase::tearDownScreen();
}

从交互系统为自定义操作添加行为

可使用交互系统为自定义操作添加行为。 只需转至拥有自定义操作的界面或自定义容器的“交互”选项卡,创建新的交互并选择“自定义操作”作为触发条件,如下图所示。

在交互系统上选择自定义操作作为触发条件

然后,在任何时候调用自定义操作,都将执行在交互中定义的任何操作。

从用户代码为自定义操作添加行为

自定义操作还可通过重写用户代码类CustomContainer1(继承自CustomContainer1Base)中的操作来实现其行为。

CustomContainer1.hpp
class CustomContainer1 : public CustomContainer1Base
{
public:
CustomContainer1();
virtual ~CustomContainer1() {}

virtual void initialize();

void action1();

protected:
};
CustomContainer1.cpp
CustomContainer1::CustomContainer1()
{

}

void CustomContainer1::initialize()
{
CustomContainer1Base::initialize();
}

void CustomContainer1::action1()
{
//Your code here
}