自訂觸發條件和行為
通過TouchGFX Designer,可以定義具有自訂觸發條件和操作的交互元件。 應用中的每個螢幕都可能包含操作集合(這些是C++中的簡單void方法),您可以從TouchGFX Designer內部和程式碼中呼叫這些操作,而自訂容器也可能有您的應用可回應的觸發條件(相當於C++中的callback)集合。 在本文中,我們將詳細介紹此功能,使得我們能創建出更簡潔、更有動態的TouchGFX應用。
自訂觸發條件
自訂容器能夠創建自訂觸發條件。 它們以C++ callback的形式生成,可從交互系統或使用者程式碼發送或做出回應。
添加自訂觸發條件
通過自訂容器的屬性選項卡添加自訂觸發條件,方法是點擊下圖中突出顯示的Triggers部分中的“+”按鈕。
在創建自訂觸發條件後,會有更多選項可供使用,如下圖所示。
名稱
在此指定的名稱將用於交互系統內部和生成的程式碼檔中的參照,如下面的程式碼範例所示:
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()
{
}
說明
此處寫入的文字將用在交互系統中,在交互系統中選中觸發條件時,將滑鼠游標停在觸發條件上可顯示此文字。 如果沒有指定說明,將創建標準說明,如從交互系統發送自訂觸發條件一節中所示。
類型
啟用“類型”將能創建觸發條件,觸發條件可返回給定類型的值。 類型既可以從列表中選擇,也可以手動輸入。 下面顯示的是當選擇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”的CustomTrigger生成了以下方法。
CustomContainer1Base.hpp
virtual void emitTrigger1Callback(bool value)
{
if (trigger1Callback && trigger1Callback->isValid())
{
this->trigger1Callback->execute(value);
}
}
此函數可在繼承自它的用戶程式碼類檔中進行重寫或呼叫。
從交互系統回應自訂觸發條件
如果向螢幕添加了具有自訂觸發條件的自訂容器,可將自訂觸發條件用作螢幕上交互系統的觸發條件,如下圖所示。
當選擇自訂觸發條件作為交互的“觸發條件”時,其命名模式為:<Custom Container Name>發生
。
在選擇“觸發條件”後,如有包含自訂觸發條件的同一自訂容器的多個實例,則需要選擇元件。 但是,如果只有一個實例,它會被自動選中。
從用戶程式碼回應自訂觸發條件
通過實現下列程式碼範例(向螢幕添加具有名為“trigger1”的自訂觸發條件的自訂容器)所示的callback,還可以從用戶程式碼回應自訂觸發條件。 在繼承自螢幕的使用者程式碼類檔中,添加了下列highlighted 顯示行來實現callback/自訂觸發條件。
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()
{
}
說明
此處寫入的文字將用在交互系統中,在交互系統中選中操作時,將滑鼠游標停在操作上可顯示此文字。 如果沒有指定說明,將按照以下模式創建標準說明,如從交互系統呼叫自訂操作一節中所示:
類型
啟用“類型”將能創建操作,操作需要給定類型的參數。 類型既可以從列表中選擇,也可以手動輸入。 下面顯示的是當選擇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
}