TouchGFX使用教程(二)

通過TouchGFX創建事件邏輯函數

TouchGFX Designer中的交互由觸發器和動作組成:
觸發器:是由用戶點擊或者進行其他操作後產生的信號。
動作:由觸發器觸發的相應的事件邏輯。

要添加interaction ,請轉到任何屏幕或自定義容器的“interaction”選項卡,然後按下標有“Add Interaction”的藍色按鈕,如下圖所示。
添加交互圖片
添加後界面樣子如下:
在這裏插入圖片描述
Trigger中用於添加觸發器類型,例如:按鈕點擊事件。Choose clicked source 中添加被點擊的是哪一個按鈕,這裏顯示的是“button1”。
Action:action的操作分爲了兩種,第一種是作爲基礎窗口的動作:
該種動作包括:

提供的內容 解釋
Call new virtual function 調用新的虛函數
Change screen 切換畫面
Execute C++ code 執行C ++代碼
Wait for 等待

第二種是控件的屬性提供的動作:

提供的內容 解釋
Move widget 移動控件
Fade widget 淡入淡出控件
Hide widget 隱藏控件
Show widget 顯示控件

在上圖的底部存在Can trigger another interaction的複選框,它的作用是連續動作,當一次觸發事件後多次響應其他的事件。

Base類中的祕密

在通過TouchGFX Designer創建完界面,並在界面中添加完相應的觸發器後,生成的代碼中將會存在相應的界面基類,這類代碼是由TouchGFX Designer自動生成的,所以不建議更改,在第一章也和大家說過,下面我們探索下這個類中有些什麼:
我們以我寫的一個例子做講解,該demo源碼在第一張中可下載。看下圖在這裏插入圖片描述
我們以MainWindow窗口作爲例子講解窗口基類中有哪些東西,首先窗口的名字叫做“MainWindow”,其中包含和三個按鈕及一個text area還有一張背景圖片Backimage。放置的順序不同在界面上體現的層次感不同,如果將背景圖片放在最上層的話其他按鈕都將被蓋在下面。其次看右側的interaction,在其中我添加了三個邏輯,類型都是按鈕的點擊事件對應的是三個按鈕,相應的功能是“Call new virtual function”,在下方寫了函數的名字。注意函數名字和控件的名字,此時,點擊Generate Code 按鈕後在VS中打開工程。可以看到在頭文件和源文件中generated/gui_generated文件夾下有mainwindow_screen文件夾存在,在該文件夾下將存在該界面的基類。如下圖:
在這裏插入圖片描述
我們看下該類中的頭文件:

/*********************************************************************************/
/********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
/*********************************************************************************/
#ifndef MAINWINDOWVIEWBASE_HPP
#define MAINWINDOWVIEWBASE_HPP

#include <gui/common/FrontendApplication.hpp>
#include <mvp/View.hpp>
#include <gui/mainwindow_screen/MainWindowPresenter.hpp>
#include <touchgfx/widgets/ScalableImage.hpp>
#include <touchgfx/widgets/ButtonWithLabel.hpp>
#include <touchgfx/widgets/TextAreaWithWildcard.hpp>
#include <touchgfx/widgets/Button.hpp>

class MainWindowViewBase : public touchgfx::View<MainWindowPresenter>
{
public:
    MainWindowViewBase();
    virtual ~MainWindowViewBase() {}
    virtual void setupScreen();  窗口創建時響應的函數

    /*
     * Virtual Action Handlers
     */
    virtual void setBackImageIMG() 這個就是在TouchGFX Designer中function name 中填的名字他就是Designer產生的關聯性。
    {
        // Override and implement this function in MainWindow
    }

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

    /*
     * Member Declarations
     */
     這部分放的就是界面上控件的名字,也就是說如果想要修改控件的動作或者狀態,除了TouchGFX Designer中修改外,也可以通過代碼調用定義修改。
    touchgfx::ScalableImage BackImage;  
    touchgfx::ButtonWithLabel ChangeImage;
    touchgfx::TextAreaWithOneWildcard textimageid;
    touchgfx::Button NextView;
    touchgfx::Button ChartARTViewButton;

    /*
     * Wildcard Buffers
     */
    static const uint16_t TEXTIMAGEID_SIZE = 3;
    touchgfx::Unicode::UnicodeChar textimageidBuffer[TEXTIMAGEID_SIZE];

private:
	這個部分就是 通過TouchGFX Designer中interaction響應的邏輯,具體的一會在cpp文件中將會看見。
    /*
     * Callback Declarations
     */
    touchgfx::Callback<MainWindowViewBase, const touchgfx::AbstractButton&> buttonCallback;

    /*
     * Callback Handler Declarations
     */
    void buttonCallbackHandler(const touchgfx::AbstractButton& src);

};

#endif // MAINWINDOWVIEWBASE_HPP

到這裏MainWindowViewBase.hpp文件參觀完了,可以接下來參觀cpp文件了。

/*********************************************************************************/
/********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
/*********************************************************************************/
#include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
#include "BitmapDatabase.hpp"
#include <texts/TextKeysAndLanguages.hpp>
#include <touchgfx/Color.hpp>

MainWindowViewBase::MainWindowViewBase() :
    buttonCallback(this, &MainWindowViewBase::buttonCallbackHandler)
{
	在構造函數中可以看見我們添加的控件在cpp文件中體現的樣子包括設置圖片或者設置位置
    BackImage.setBitmap(touchgfx::Bitmap(BITMAP_IMG1_ID));
    BackImage.setPosition(0, 0, 800, 480);
    BackImage.setScalingAlgorithm(touchgfx::ScalableImage::NEAREST_NEIGHBOR);

    ChangeImage.setXY(315, 0);
    ChangeImage.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_PRESSED_ID));
    ChangeImage.setLabelText(touchgfx::TypedText(T_SINGLEUSEID1));
    ChangeImage.setLabelColor(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
    ChangeImage.setLabelColorPressed(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
    ChangeImage.setAction(buttonCallback);這裏可以看見添加action方法

    textimageid.setPosition(394, 68, 26, 25);
    textimageid.setColor(touchgfx::Color::getColorFrom24BitRGB(255, 0, 0));
    textimageid.setLinespacing(0);
    Unicode::snprintf(textimageidBuffer, TEXTIMAGEID_SIZE, "%s", touchgfx::TypedText(T_SINGLEUSEID3).getText());
    textimageid.setWildcard(textimageidBuffer);
    textimageid.setTypedText(touchgfx::TypedText(T_SINGLEUSEID2));

    NextView.setXY(377, 135);
    NextView.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));
    NextView.setAction(buttonCallback);

    ChartARTViewButton.setXY(377, 230);
    ChartARTViewButton.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));
    ChartARTViewButton.setAction(buttonCallback);頁面切換的action函數
在窗口上添加控件方法
    add(BackImage);
    add(ChangeImage);
    add(textimageid);
    add(NextView);
    add(ChartARTViewButton);
}

void MainWindowViewBase::setupScreen()
{

}

void MainWindowViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src)
{
    if (&src == &ChangeImage)
    {
        //Interaction1
        //When ChangeImage clicked call virtual function
        //Call setBackImageIMG
        setBackImageIMG();這裏可以看見是通過callback函數響應的setBackImageIMG函數,由此可以知道以此方法我們可以自己在界面上添加控件,而控件響應的函數也可以這樣添加。注意要是自定義添加不要在base文件中添加要在界面類的函數中添加。
    }
    else if (&src == &NextView)
    {
        //Interaction2
        //When NextView clicked change screen to TabView
        //Go to TabView with screen transition towards East
        application().gotoTabViewScreenSlideTransitionEast();
    }
    else if (&src == &ChartARTViewButton)
    {
        //Interaction3
        //When ChartARTViewButton clicked change screen to ChartView
        //Go to ChartView with screen transition towards East
        application().gotoChartViewScreenSlideTransitionEast();
    }
}

由此可以看到創建的界面後,base文件中的狀態。下面會給大家展示一下view文件中的內容。

View類的作用

view中的內容是可以進行修改的,可以根據需要添加自己的使用方法。
下面我們再看一下MainWindowView.hpp文件。

#ifndef MAINWINDOWVIEW_HPP
#define MAINWINDOWVIEW_HPP

#include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
#include <gui/mainwindow_screen/MainWindowPresenter.hpp>


class MainWindowView : public MainWindowViewBase這裏看見這個類是繼承上方的基類MainWindowViewBase
{
public:
    MainWindowView();
    virtual ~MainWindowView() {}
    virtual void setupScreen(); 正常創建時,到此處就沒有了。
    下方的文件是手動添加的,如果在界面上創建了function函數,
    則在該文件中添加一樣的虛函數,具體在上方的base中能看出來。
    virtual void tearDownScreen();
    virtual void setBackImageIMG();
protected:

};

#endif // MAINWINDOWVIEW_HPP

此時就可以在cpp文件中添加相應的函數實現了。

按鍵事件響應邏輯

好了說了這麼多,我來給大家總結一下吧,通過TouchGFX Designer創建一個界面,在界面中可拖拽控件,在TouchGFX Designer下也可添加相應的action函數,在添加完函數後,要在view文件中加入相應的虛函數。
除此之外,還可以模仿base文件的方法在界面類中添加相應的button及button的action文件。此章給大家介紹了創建事件的注意示項。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章