通过TouchGFX创建事件逻辑函数
2 a, p$ n/ M9 w4 RTouchGFX Designer中的交互由触发器和动作组成:+ l) T7 f; J/ v
触发器:是由用户点击或者进行其他操作后产生的信号。$ H( t' e- i& @$ U1 N
动作:由触发器触发的相应的事件逻辑。4 ~2 k B7 m/ v! F. M
要添加interaction ,请转到任何屏幕或自定义容器的“interaction”选项卡,然后按下标有“Add Interaction”的蓝色按钮,如下图所示。% x+ \( I; k9 T" M) }! t2 |9 a
: y2 ~9 v ?; |9 E4 M
5 z7 b: P% E7 Q- H% f
; z0 M4 O; l7 d }添加后界面样子如下:
0 U. }( r& T, V/ m5 E& r) q
0 y# I. b2 D. G2 X* Y0 ~
, l, h% B; s T
1 k/ |; B. q$ g- s8 z, o) B
Trigger中用于添加触发器类型,例如:按钮点击事件。Choose clicked source 中添加被点击的是哪一个按钮,这里显示的是“button1”。+ w2 {+ @; r- n: p; `( d
Action:action的操作分为了两种,第一种是作为基础窗口的动作:$ m5 G- A' {& U# `- q( _3 ~
该种动作包括:& S% _, Q6 T; Z4 M1 F* t+ A
6 t3 j/ f; X4 l/ U# x* z
1 X" m# \6 H* s+ e: _
+ i5 e2 D7 o' V* P第二种是控件的属性提供的动作:
) c$ Z* p' a; F; P' ^3 j, L
& o3 D; a0 I3 v! I0 g* ]/ `
% h! f& k& b! z7 J' G$ w: B" _. q( X& X1 x1 B; Z1 c7 X
在上图的底部存在Can trigger another interaction的复选框,它的作用是连续动作,当一次触发事件后多次响应其他的事件。
( n/ D$ J# C1 u a8 ?3 x. D: n( I* f
- B/ ]% e+ |' C- IBase类中的秘密
[/ S9 h) i) b* S3 C& C! l在通过TouchGFX Designer创建完界面,并在界面中添加完相应的触发器后,生成的代码中将会存在相应的界面基类,这类代码是由TouchGFX Designer自动生成的,所以不建议更改,在第一章也和大家说过,下面我们探索下这个类中有些什么:
: }( r7 u7 I% i+ f$ o我们以我写的一个例子做讲解,该demo源码在第一张中可下载。看下图
6 x( j I, y& t; k
/ ?/ X: u/ T4 _& ]# f5 I2 n! Z
3 H7 ]8 |9 d# n2 P; V, ]
& V0 a" }, A( E. i/ b
5 ?/ X9 @7 @+ ^( B; U- @" f我们以MainWindow窗口作为例子讲解窗口基类中有哪些东西,首先窗口的名字叫做“MainWindow”,其中包含和三个按钮及一个text area还有一张背景图片Backimage。放置的顺序不同在界面上体现的层次感不同,如果将背景图片放在最上层的话其他按钮都将被盖在下面。其次看右侧的interaction,在其中我添加了三个逻辑,类型都是按钮的点击事件对应的是三个按钮,相应的功能是“Call new virtual function”,在下方写了函数的名字。注意函数名字和控件的名字,此时,点击Generate Code 按钮后在VS中打开工程。可以看到在头文件和源文件中generated/gui_generated文件夹下有mainwindow_screen文件夹存在,在该文件夹下将存在该界面的基类。如下图:
3 t% i4 H) i* C7 |2 x1 ]+ _9 J$ V; M2 M) I% S) g
0 U0 E% Q7 L* G8 k
' C" }8 ?( O/ n我们看下该类中的头文件:* W% l) D' f- q. f
- /*********************************************************************************/% G0 z2 \) n4 Y) U4 Q0 d, \/ b9 j
- /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/! Q% X; G* O0 i: @4 z( F- v
- /*********************************************************************************/' q( X# f% e7 W7 |9 v# K
- #ifndef MAINWINDOWVIEWBASE_HPP
. E8 e5 R* f: q- L7 ^ - #define MAINWINDOWVIEWBASE_HPP3 u" s# ~7 R1 v# ]3 C0 k& R
- % k2 f4 C1 k6 t ~) H2 i
- #include <gui/common/FrontendApplication.hpp>
6 O, ^6 x4 b$ G: u0 k. R - #include <mvp/View.hpp>
- L3 k9 C$ N0 i9 R1 M - #include <gui/mainwindow_screen/MainWindowPresenter.hpp>; x4 u% n5 Q4 O6 q) p" `
- #include <touchgfx/widgets/ScalableImage.hpp>; _7 O1 L" n- B+ t: p, ~
- #include <touchgfx/widgets/ButtonWithLabel.hpp>9 `# {8 k( l& z
- #include <touchgfx/widgets/TextAreaWithWildcard.hpp># d$ W& _3 c2 X, q+ X; u- ]! N: E
- #include <touchgfx/widgets/Button.hpp>7 v8 @$ U1 c3 d
7 t8 S* F& i& m- class MainWindowViewBase : public touchgfx::View<MainWindowPresenter>
. g8 R) ~/ a) w - {. {) d0 J$ E% }8 H+ G
- public:
6 T& Z! i' s" S! F- g/ X$ X/ v - MainWindowViewBase();( J! q4 P+ v2 u5 i7 K2 c2 X$ @1 q' \9 \
- virtual ~MainWindowViewBase() {}
- D: g. }" Z2 H# S. o - virtual void setupScreen(); 窗口创建时响应的函数8 M! Y8 S3 E1 `! O8 q3 i
* f0 D6 @' O' K/ e; d4 L- /*
% }+ r$ v; b1 G' o* y+ S( t - * Virtual Action Handlers
* O: s5 s! u" F. K - *// g: i2 E* L1 R$ U0 Y4 z3 V1 N
- virtual void setBackImageIMG() 这个就是在TouchGFX Designer中function name 中填的名字他就是Designer产生的关联性。
; u( V# z3 W1 b4 e - {0 D7 p/ C0 C2 Z! l0 E
- // Override and implement this function in MainWindow5 ~& S4 N/ {; A$ X8 G- o
- }
3 ?0 Y* E: j. S9 q0 H0 J - S; b! r2 `7 ~7 u* B; J3 m
- protected:
% ` {2 J9 H, ~5 u - FrontendApplication& application() {
$ r. g3 r# {7 i- [( @ - return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());1 s5 b. D1 z S8 j: |$ j$ \
- }
& i- i# `) }0 |1 m, s. T/ |
5 I n1 j: ^8 b9 H! ^/ d$ B- }) r, k @- /*. P6 v7 `0 q# l' @* E. B, d+ k
- * Member Declarations6 c; \; v( B5 E( b' u* Z
- */( }! Y( L% x6 l0 K5 Q9 J$ O
- 这部分放的就是界面上控件的名字,也就是说如果想要修改控件的动作或者状态,除了TouchGFX Designer中修改外,也可以通过代码调用定义修改。4 N6 ] `) I% f9 c" V) o: s& c
- touchgfx::ScalableImage BackImage;
1 b/ g( m( ?& i7 o' N& F - touchgfx::ButtonWithLabel ChangeImage;
( D8 w/ Q( G$ F( [9 \3 ~ - touchgfx::TextAreaWithOneWildcard textimageid;6 ~" ?5 s1 t+ ~* g R5 K9 p
- touchgfx::Button NextView;
; @- ^4 s: B- Y h% z& _3 P/ n; q - touchgfx::Button ChartARTViewButton;
, N! O; N3 [: h6 Y9 \: a: y - : K; o9 `/ t4 r( m8 }9 X- C! N
- /*! E2 s3 N) e% b% [: N; P0 L1 d+ o
- * Wildcard Buffers9 ?; y; Q: [/ \2 F x" q8 @
- */2 F5 P# W b/ N
- static const uint16_t TEXTIMAGEID_SIZE = 3;
% ~, e( ]) u) c9 d) u - touchgfx::Unicode::UnicodeChar textimageidBuffer[TEXTIMAGEID_SIZE];
' Q; [8 ^9 s9 V/ e. r
. R# ] J% M% x ?4 i7 W. S- private:
( F% Y' p7 T5 I; X - 这个部分就是 通过TouchGFX Designer中interaction响应的逻辑,具体的一会在cpp文件中将会看见。
. p9 @4 K! p, W! J& H, i0 \ - /*/ v- t* p7 A# N
- * Callback Declarations
{( s' B2 u7 i- G% | - */
! ^: q! Z- E' u% [) S+ f \, [ - touchgfx::Callback<MainWindowViewBase, const touchgfx::AbstractButton&> buttonCallback;! F: z1 Y9 b1 g% c; t% S
" r) b6 M/ E" T* z. G- /*6 B. l. ]+ J1 N# D% v! L% }! u
- * Callback Handler Declarations
- |; a Z5 L" [/ D* p) Z - */2 t# z; e$ V- t* O. D6 b
- void buttonCallbackHandler(const touchgfx::AbstractButton& src);1 d8 l7 D& }) N9 W- [ | y! E
3 `. q* P1 O: T& M W6 l- };6 ~! ` q" m5 p$ h2 ]
- + ?& S# ~5 Z/ m- B' Q" H6 |
- #endif // MAINWINDOWVIEWBASE_HPP8 \2 U+ k, f' [4 J8 @4 ]* k
- * h* o3 u; Q! i4 I5 ] n" ^
复制代码 # X. \: F+ z, U+ b- A( p5 h8 p
到这里MainWindowViewBase.hpp文件参观完了,可以接下来参观cpp文件了。
# O5 T& D3 Q5 t! z2 M- /*********************************************************************************/
; D% b: R) ?$ I! c - /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/1 q7 H6 W9 @3 t% @
- /*********************************************************************************/- s' Y @" ~) a/ ]
- #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>3 i) ^3 }4 H+ t' u2 p
- #include "BitmapDatabase.hpp"
# x8 i: S% M! A. m# l( ^, }$ C# [1 h - #include <texts/TextKeysAndLanguages.hpp>$ X6 G5 L1 Q% V
- #include <touchgfx/Color.hpp>
3 v& S- Q( z, g9 d
- |3 V. x2 n# e( N& n. q- MainWindowViewBase::MainWindowViewBase() :' W$ G* W" h- f8 @& [
- buttonCallback(this, &MainWindowViewBase::buttonCallbackHandler)$ ~( \+ }3 u% E" c- {' ]' x
- {
; L* }! _" m9 s - 在构造函数中可以看见我们添加的控件在cpp文件中体现的样子包括设置图片或者设置位置
, E" q' z0 {: y# x) c0 x5 q0 ] - BackImage.setBitmap(touchgfx::Bitmap(BITMAP_IMG1_ID));) D& M" ?' t8 N: l% ~' z! F
- BackImage.setPosition(0, 0, 800, 480);
: b k5 h3 I6 _% Z - BackImage.setScalingAlgorithm(touchgfx::ScalableImage::NEAREST_NEIGHBOR);; ]& \2 a6 ]5 B5 j$ U% |0 c \
3 G2 e3 R% v9 x4 v% A- ChangeImage.setXY(315, 0);, a' Y; k. e. s8 }: n5 s
- ChangeImage.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_PRESSED_ID));% v5 y& r0 W1 [) U
- ChangeImage.setLabelText(touchgfx::TypedText(T_SINGLEUSEID1));
* O' Q* P. ^* L% b' R( V- Z$ w# p - ChangeImage.setLabelColor(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
7 H7 R6 w* T: N4 v - ChangeImage.setLabelColorPressed(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
2 ~. c2 k5 E* K1 u0 r0 ^- ] - ChangeImage.setAction(buttonCallback);这里可以看见添加action方法
/ A& E/ b, X0 M9 ^
0 \& Q9 Z8 s7 f- textimageid.setPosition(394, 68, 26, 25);7 B' M4 k- e: E& K. c
- textimageid.setColor(touchgfx::Color::getColorFrom24BitRGB(255, 0, 0));
4 n1 Z; G. m, m" A: L5 l. Q1 M2 r - textimageid.setLinespacing(0);
, m( ~/ k+ q6 A* X/ C0 P - Unicode::snprintf(textimageidBuffer, TEXTIMAGEID_SIZE, "%s", touchgfx::TypedText(T_SINGLEUSEID3).getText());
/ k6 h7 ?: W9 C2 m5 ?/ m - textimageid.setWildcard(textimageidBuffer);" |# x! A0 \9 D2 a, H
- textimageid.setTypedText(touchgfx::TypedText(T_SINGLEUSEID2));
3 R* O3 d. v4 e s
: A4 ^4 b' w+ d; c0 |. V- NextView.setXY(377, 135);# x; x1 W& m: z O/ B$ Q
- NextView.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));
( d0 Y* g! ~1 @2 i* R - NextView.setAction(buttonCallback);" ^ A9 ^! k& {: t; H) B& @0 R
- & q0 {; `/ }+ D. \: H, k1 }. \
- ChartARTViewButton.setXY(377, 230);
# l3 k, V3 B6 d/ Z% D - ChartARTViewButton.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));- A p8 }- L1 c+ v, n
- ChartARTViewButton.setAction(buttonCallback);页面切换的action函数
- n3 t- z8 m0 V$ T - 在窗口上添加控件方法
& Y' v) c8 K0 M$ U* T3 ] - add(BackImage);
# T7 |8 @. {. L; F$ L3 P - add(ChangeImage);+ S/ L2 e% a: E# u' \) P
- add(textimageid); Y M/ m4 ?( C) o( s* a$ P3 F
- add(NextView);1 z( w2 U( e7 h( e5 C! o
- add(ChartARTViewButton);$ K. m9 L$ U/ r# y- w
- }
4 s* G1 h, x1 `4 Z c* V% `4 S. M - % O7 G5 j! n4 l; o6 h
- void MainWindowViewBase::setupScreen()* b& u* t9 F$ @! W' l+ O
- {
& e, \3 u+ \2 l+ |% b
4 X# e* b5 z* z- }
. Z+ _* x$ |0 T2 [: e4 t - 6 w" C! V) X8 S+ q) ?: i0 B( X/ F2 {
- void MainWindowViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src)/ `0 f5 G/ [5 P/ y
- { g) `' w% V& v* ?) g9 {1 |
- if (&src == &ChangeImage)
* z2 g$ R) W$ a; {. I - {
( d3 t! t! m$ n - //Interaction1$ w$ l( I/ M4 Z6 m5 f
- //When ChangeImage clicked call virtual function
) ~, x! w0 q' A: T. G' o; G1 N - //Call setBackImageIMG0 I& o t Y. \! ] |2 H1 J
- setBackImageIMG();这里可以看见是通过callback函数响应的setBackImageIMG函数,由此可以知道以此方法我们可以自己在界面上添加控件,而控件响应的函数也可以这样添加。注意要是自定义添加不要在base文件中添加要在界面类的函数中添加。8 J3 H! g' c# \7 d) z- x( g
- }: |) o% @0 N6 [; n7 r6 K
- else if (&src == &NextView)) t) ~! T' {1 y8 Z2 _, ^4 ^2 V
- {4 U, t+ F, V2 f+ t+ V
- //Interaction2) s4 E/ ^" G- T1 k
- //When NextView clicked change screen to TabView
6 y& @: O5 o! v* X - //Go to TabView with screen transition towards East& }4 O. `2 [. ?4 t0 u0 q- u
- application().gotoTabViewScreenSlideTransitionEast();
5 w6 H3 J7 _7 Z4 |# C8 A8 r0 F - }
5 b+ e9 P& i) }# v - else if (&src == &ChartARTViewButton)
2 ]4 ~ [5 b4 O7 D- x; z - {
: M( N+ [. B4 J1 o# C$ S* g Z - //Interaction3
, u+ |8 J# |& K7 R' ^7 {; R+ z - //When ChartARTViewButton clicked change screen to ChartView
# ~: n" V; ^; i k: F0 x - //Go to ChartView with screen transition towards East
$ o5 v2 o& l) L. O! I! {/ _) U - application().gotoChartViewScreenSlideTransitionEast();) Q* t* r" a" ~3 f* h2 D
- }- [1 X7 G/ i0 k1 Z
- }
2 ~5 J3 F1 v5 u! ^, p! \ - ; ?% p. g- D$ D3 I' D
复制代码 0 x- P6 K K2 n: u8 h
由此可以看到创建的界面后,base文件中的状态。下面会给大家展示一下view文件中的内容。
$ Y4 }1 K' t3 y
: Q' _) M3 _7 ^, n) ~ G4 u9 Z7 J G& K- l6 {
View类的作用
1 Y" ~- S' ]8 l( ]view中的内容是可以进行修改的,可以根据需要添加自己的使用方法。) g3 t; v, n+ f+ Q/ q$ {# r
下面我们再看一下MainWindowView.hpp文件。
' T: j& k% u1 K- #ifndef MAINWINDOWVIEW_HPP
0 r9 m' Q% J$ \ - #define MAINWINDOWVIEW_HPP
A" x# B9 ?+ G% N) D
" K5 H5 B4 E! i! l- I- #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
- k8 Y S8 G) z# y7 N - #include <gui/mainwindow_screen/MainWindowPresenter.hpp>
( x5 Y# ~. B5 m3 }: S - * a# u I9 O! t6 U" X
- Q! q# y! |) B( Y- class MainWindowView : public MainWindowViewBase这里看见这个类是继承上方的基类MainWindowViewBase
$ l( O$ Q% F6 ], | - {8 e% R1 l8 H8 R' G+ I! O
- public:
/ y7 O$ f( J" f1 m - MainWindowView(); ?9 ?& C( ?0 L5 \* y3 u( W( U
- virtual ~MainWindowView() {}
$ r/ o/ \. ?0 b/ P2 U - virtual void setupScreen(); 正常创建时,到此处就没有了。* Q' _2 ^2 v+ n2 s# ` I3 V
- 下方的文件是手动添加的,如果在界面上创建了function函数,
; U: }- M7 d! J0 {* o7 `* ? - 则在该文件中添加一样的虚函数,具体在上方的base中能看出来。
4 o* w& q6 w0 D/ a% ^9 N - virtual void tearDownScreen();
L9 h9 e5 u9 T/ I! Y6 k# p - virtual void setBackImageIMG();. r& b3 `! w' J3 O1 j4 u
- protected:
" [: O6 z: T0 E5 P) r" L
, _# d# |, Q0 v# i- };
2 S- b/ \' d }! B& U K0 k
/ P9 P% D- F2 A8 Z: N% f2 ?1 G- #endif // MAINWINDOWVIEW_HPP- Z: J3 {3 L- U. i8 ]" m
复制代码
5 h- h0 a/ U' y4 q此时就可以在cpp文件中添加相应的函数实现了。
. D( M8 O+ I- r; _6 ^6 l |# Z. P" g3 y' g# l# u$ b
按键事件响应逻辑
) s4 B$ W9 r+ V4 Z% @ V好了说了这么多,我来给大家总结一下吧,通过TouchGFX Designer创建一个界面,在界面中可拖拽控件,在TouchGFX Designer下也可添加相应的action函数,在添加完函数后,要在view文件中加入相应的虚函数。
+ \4 E5 `! D! M7 z除此之外,还可以模仿base文件的方法在界面类中添加相应的button及button的action文件。此章给大家介绍了创建事件的注意示项。
! c1 R& M8 z5 o0 R2 p9 W5 n2 R————————————————
$ e( \/ l5 m) u' t) I版权声明:空闲的程序员
! ]9 F+ `0 }3 M0 q0 z( H; @6 h
3 S5 S+ U! b' C3 I5 `3 G2 i+ N
' I7 @" \' L6 A( C7 g+ T |