通过TouchGFX创建事件逻辑函数9 Q3 E& D% ?3 q) a
TouchGFX Designer中的交互由触发器和动作组成:' u3 b6 }" l9 e7 `- n) @6 W# F. G
触发器:是由用户点击或者进行其他操作后产生的信号。3 C* q0 u0 }9 ^* Y' v8 S/ g h; m
动作:由触发器触发的相应的事件逻辑。1 \/ E& A i5 X3 _# p
要添加interaction ,请转到任何屏幕或自定义容器的“interaction”选项卡,然后按下标有“Add Interaction”的蓝色按钮,如下图所示。6 V; o1 r) C! s
6 O3 L2 I o; A0 ^9 N8 [
1 ~$ w6 L( C- Z" a" e: t$ H
~) q) r0 O* a$ ~2 f& \# T! C r添加后界面样子如下:' K5 e3 S, u7 F9 A5 U
4 c- i4 `: F) x3 L
" `+ o: d& `+ ^, w. l2 V) L: I
Trigger中用于添加触发器类型,例如:按钮点击事件。Choose clicked source 中添加被点击的是哪一个按钮,这里显示的是“button1”。
# b0 J' u+ ~+ i2 ^3 C h4 v+ ]Action:action的操作分为了两种,第一种是作为基础窗口的动作:
( n8 {7 y& B# E2 }/ n; w' d该种动作包括:
+ A5 Q. [- I& O' H& w% W `$ {3 {1 ^! W
, v$ h9 R' c _4 w2 ?& D9 c7 a7 n1 h( P" `2 E [2 `9 J6 h
第二种是控件的属性提供的动作:( l! g4 ~7 A- ?8 E3 `' m
; g* A5 A1 t2 L% F$ ~2 E
+ n- |3 z: n- P7 L( c: R+ S
' K( H' K7 g3 y在上图的底部存在Can trigger another interaction的复选框,它的作用是连续动作,当一次触发事件后多次响应其他的事件。5 Q9 [, {/ e7 c
J$ i/ J9 E7 n4 I
Base类中的秘密: N) B3 Y2 j0 y' c/ u; D
在通过TouchGFX Designer创建完界面,并在界面中添加完相应的触发器后,生成的代码中将会存在相应的界面基类,这类代码是由TouchGFX Designer自动生成的,所以不建议更改,在第一章也和大家说过,下面我们探索下这个类中有些什么:& q* U1 {+ |5 k
我们以我写的一个例子做讲解,该demo源码在第一张中可下载。看下图/ |! N- K1 Q2 d5 T( M1 @- f
" t' l& t) s( G0 r
# t& w) i! b+ Q [% ^5 n
5 T3 h- P4 u; M5 U# N6 E. w4 y! {! ~+ @" O% c
我们以MainWindow窗口作为例子讲解窗口基类中有哪些东西,首先窗口的名字叫做“MainWindow”,其中包含和三个按钮及一个text area还有一张背景图片Backimage。放置的顺序不同在界面上体现的层次感不同,如果将背景图片放在最上层的话其他按钮都将被盖在下面。其次看右侧的interaction,在其中我添加了三个逻辑,类型都是按钮的点击事件对应的是三个按钮,相应的功能是“Call new virtual function”,在下方写了函数的名字。注意函数名字和控件的名字,此时,点击Generate Code 按钮后在VS中打开工程。可以看到在头文件和源文件中generated/gui_generated文件夹下有mainwindow_screen文件夹存在,在该文件夹下将存在该界面的基类。如下图:) c+ w7 J9 ?$ V( _" P
# I1 z, K) @- C: j
7 c& S" |/ X& n' D) q2 f" I, Y7 Z$ L4 V9 O7 t* J8 L1 a
我们看下该类中的头文件:. H. f9 B; l: E% n/ Y
- /*********************************************************************************/
9 v9 {, r7 h% ~ D1 M# [ - /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
" h9 C9 {) ?' }( m9 [, M( M - /*********************************************************************************// @- }) b0 Y0 _# i/ }
- #ifndef MAINWINDOWVIEWBASE_HPP6 X, |" j4 Z, P2 y
- #define MAINWINDOWVIEWBASE_HPP
, V4 F: D4 A- g4 {. A# j
8 ?0 O& t: q# F: O5 u" W: @& s, J- #include <gui/common/FrontendApplication.hpp>
1 B! `% i: z" ] q. D6 S/ T - #include <mvp/View.hpp>
- B+ g0 O1 B+ E) Y0 { - #include <gui/mainwindow_screen/MainWindowPresenter.hpp>8 P( H3 \, ]8 \" T$ E
- #include <touchgfx/widgets/ScalableImage.hpp>
/ t4 k' \; e' P" j* b - #include <touchgfx/widgets/ButtonWithLabel.hpp>
0 q0 a& _% n$ H% v8 M+ W* m - #include <touchgfx/widgets/TextAreaWithWildcard.hpp>
. b4 i* \! R8 |/ f! _ - #include <touchgfx/widgets/Button.hpp>" o4 S9 |' D, u: Z, m# e) s
1 i1 V5 x% v' F9 n- class MainWindowViewBase : public touchgfx::View<MainWindowPresenter>* t' g1 _( s& |$ d/ a. X
- {4 L: e) D. g3 [% s& n% \* S7 F
- public:
/ `* g0 f! j5 y/ k - MainWindowViewBase();* ]( N( o8 n7 Z3 g% q9 W
- virtual ~MainWindowViewBase() {}7 V4 L5 }" x& m6 e* _" |5 Z
- virtual void setupScreen(); 窗口创建时响应的函数- ]; T5 g% g. I6 i/ r
( z. w2 A: Z$ x7 t5 m7 A0 n- C b- /*
4 x: C5 |; d9 S1 s, H7 d% ~ - * Virtual Action Handlers) z P! D$ Y) C' B0 `) Q) R* ^( P
- */
) u7 i3 K5 {/ H* }: p/ Z' ~" F - virtual void setBackImageIMG() 这个就是在TouchGFX Designer中function name 中填的名字他就是Designer产生的关联性。
$ l6 M% r7 i! p. G - {
* K! S1 `: z$ ~2 U% L% I! M% z - // Override and implement this function in MainWindow
& B$ {& s8 [: ^" j - }
% T9 l/ B. D$ s6 o( d - 7 z \) G) M/ @! F* u4 S
- protected:$ j! j- _# H' [0 Z# H. W, W
- FrontendApplication& application() {
- V5 D+ G3 B/ z - return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());
% F) Y1 E# A/ K$ a1 ] - }
2 ^+ Y* t' J1 J
( u) C' X9 w5 }- d6 j/ z- /*: T R" ?+ E% U) y( x/ a/ h
- * Member Declarations
) N' e$ e2 }- Z* \4 S - */! u9 e. {/ ]! E0 m$ D
- 这部分放的就是界面上控件的名字,也就是说如果想要修改控件的动作或者状态,除了TouchGFX Designer中修改外,也可以通过代码调用定义修改。' E7 N* ^4 z8 g
- touchgfx::ScalableImage BackImage;
$ v1 |! c3 ]2 Q" p. p! V$ C - touchgfx::ButtonWithLabel ChangeImage;7 n" W& a0 i+ e3 k) g
- touchgfx::TextAreaWithOneWildcard textimageid;
4 n4 [6 C8 s2 { - touchgfx::Button NextView;
! ^9 R4 J* d- G5 g - touchgfx::Button ChartARTViewButton;
; h9 S& ]* Q( q- ?( S - % c: G( [* h8 S# n, i
- /** ~% q2 ]! {2 J1 @, b& ]2 w
- * Wildcard Buffers
2 m8 f; E6 l( k+ w: Q& p, p7 h" l - */4 L; H, f& |' h2 N% i( v9 J
- static const uint16_t TEXTIMAGEID_SIZE = 3;$ D% H5 B. Y& ]2 b0 D
- touchgfx::Unicode::UnicodeChar textimageidBuffer[TEXTIMAGEID_SIZE];; W7 H/ t# M0 Z: e3 z& \, n
- ( E9 A8 Q1 C& d& u1 N: h
- private:
: I( q6 i/ b/ J# x. y - 这个部分就是 通过TouchGFX Designer中interaction响应的逻辑,具体的一会在cpp文件中将会看见。
1 L5 h7 V1 [- v% I8 I$ t9 C - /*( p! K. J* h* ~
- * Callback Declarations
( y! F Q8 ]5 `0 S- a* p - */9 a7 @5 V$ b0 e3 |
- touchgfx::Callback<MainWindowViewBase, const touchgfx::AbstractButton&> buttonCallback;" B) i& Y: r( d1 a' M1 C, t7 [
! w. T- S3 h9 L' X2 A. h- /*
- c5 Z3 j2 O/ s) A# S - * Callback Handler Declarations
7 B( q0 Y3 C/ W" n - */) B/ y; q* U0 Z; Z
- void buttonCallbackHandler(const touchgfx::AbstractButton& src);
' |5 R" m8 _- i6 \ - * `9 }$ r& N) h
- };
# x0 X1 B/ }, E/ K) d - 2 Y+ f' A/ r- p1 V# n/ ?: K }" w
- #endif // MAINWINDOWVIEWBASE_HPP
: R t# W4 Q0 m! E | p& v! q - D/ n+ ] f {: E
复制代码
6 R9 `, ~3 h, x9 H5 W到这里MainWindowViewBase.hpp文件参观完了,可以接下来参观cpp文件了。
) P+ z: ]* u/ V/ b, o- /*********************************************************************************/
8 l/ d' d; ~; |; f - /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
) d/ \9 i/ W0 ~: |$ ?6 o. q: B - /*********************************************************************************/
l2 H D# b9 N; w - #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>9 |& h4 f8 I" A4 P
- #include "BitmapDatabase.hpp"/ A, @7 c0 m( G; A# W- O
- #include <texts/TextKeysAndLanguages.hpp>& p H( ] ]$ p' d
- #include <touchgfx/Color.hpp>4 }6 V: G% R# X, s6 [5 Q% _5 {1 l
- 6 |% z& \- a4 Y7 v
- MainWindowViewBase::MainWindowViewBase() :3 E+ A$ { O; {* m
- buttonCallback(this, &MainWindowViewBase::buttonCallbackHandler)! T' j7 R7 z% L( e, M- z" \
- {
6 N+ q. }- t: f6 @2 k( s - 在构造函数中可以看见我们添加的控件在cpp文件中体现的样子包括设置图片或者设置位置6 U3 c+ H! _8 W3 F% |% z7 B- y' `
- BackImage.setBitmap(touchgfx::Bitmap(BITMAP_IMG1_ID));0 s+ C! M v+ j' ~5 @7 p
- BackImage.setPosition(0, 0, 800, 480);1 ` @6 I, _6 P# D
- BackImage.setScalingAlgorithm(touchgfx::ScalableImage::NEAREST_NEIGHBOR);5 g4 D' F/ m/ ~- R7 q" I
. F8 N3 s+ [% ^9 l- ChangeImage.setXY(315, 0);
' }2 ? P, g# h* J+ Z - ChangeImage.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_PRESSED_ID));! @. Q/ h% t4 B. C- w8 `- ~
- ChangeImage.setLabelText(touchgfx::TypedText(T_SINGLEUSEID1));# L( I" O* m9 u# Q. \3 d9 c- ?
- ChangeImage.setLabelColor(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
! T) D7 k* y; k+ k2 B - ChangeImage.setLabelColorPressed(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
! l8 I7 ]( ^* @' o2 E3 g/ p - ChangeImage.setAction(buttonCallback);这里可以看见添加action方法3 p: |' D6 t, g9 ~! q; M, W" j
+ b$ e2 @' k! S+ U" z4 W- textimageid.setPosition(394, 68, 26, 25);
: X3 c0 u" f1 w! O+ [5 Q! x - textimageid.setColor(touchgfx::Color::getColorFrom24BitRGB(255, 0, 0)); t' i1 {0 Y8 |1 [8 M( q
- textimageid.setLinespacing(0);) |0 \! A$ f5 j
- Unicode::snprintf(textimageidBuffer, TEXTIMAGEID_SIZE, "%s", touchgfx::TypedText(T_SINGLEUSEID3).getText());
" G" F5 {2 |" `& h4 o - textimageid.setWildcard(textimageidBuffer);
+ B+ ~7 o* g- m7 f; ? - textimageid.setTypedText(touchgfx::TypedText(T_SINGLEUSEID2));2 u5 z4 X' R; [* ~6 g2 ~
- $ r( s! m2 \; t0 k& F, C
- NextView.setXY(377, 135);% [5 [* y3 \4 S
- NextView.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));
% @' \2 A& V/ ]: Y8 G% R6 g) B - NextView.setAction(buttonCallback);5 Q' `4 p6 K+ c" D7 Q: B0 i% i$ n
9 z( G. P N, e& c" N5 g$ K6 d- ChartARTViewButton.setXY(377, 230);
( a% o8 {0 r5 u2 [* u - ChartARTViewButton.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));
* B. W7 M7 u k7 B - ChartARTViewButton.setAction(buttonCallback);页面切换的action函数
0 U' X% W: Z! C6 l5 } - 在窗口上添加控件方法" C' X/ t& r6 Z# q; `* R% y
- add(BackImage);5 i$ R! i2 a3 c+ V7 {! s
- add(ChangeImage);
% D# s; Z) ]0 H; S - add(textimageid);2 ?/ c, I7 a p& g6 U6 |
- add(NextView);
2 c F" z! ?# q; R# B - add(ChartARTViewButton);
9 L" G( _( J; W# N/ b - }7 J! B& }5 v7 ^/ x
- 9 t# Z% L4 ]3 [5 V* N3 P
- void MainWindowViewBase::setupScreen()! E x ]2 @+ ]- U4 G# L& g) M6 e N
- {
4 e: e! t0 R% q - 2 D$ S3 u, @9 @1 H. O0 _$ J, }
- }; n' g+ g" H+ @! ?* C- e/ ] M
- # J4 s& O7 ?* @2 u* M- J, E; K
- void MainWindowViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src)
) ?% F1 ^( K0 E' _$ M( q - {
( d, U! B* d( a/ S - if (&src == &ChangeImage)
1 g! W5 f- n& ?4 `/ ` - {; p5 g [" v- p& O
- //Interaction1
% [- p3 x! U& t8 Q) \9 k - //When ChangeImage clicked call virtual function; Z) B, T5 Y3 j
- //Call setBackImageIMG2 q0 ~2 v7 E8 M f, }3 f( Q
- setBackImageIMG();这里可以看见是通过callback函数响应的setBackImageIMG函数,由此可以知道以此方法我们可以自己在界面上添加控件,而控件响应的函数也可以这样添加。注意要是自定义添加不要在base文件中添加要在界面类的函数中添加。3 c& u' f3 `3 o# R- {
- }& a7 A& \- X+ W! c( u! \$ u
- else if (&src == &NextView)1 ?+ w$ t; k1 N
- {. a( b4 N8 x9 M: ^1 P$ W/ _0 G6 t
- //Interaction2: t4 [5 V- r7 x0 y4 D! ^ _5 b: Z$ i
- //When NextView clicked change screen to TabView
# H9 R2 Q- \: E8 a+ r - //Go to TabView with screen transition towards East
2 s6 n4 B5 {" \: {) W% F" t' O9 t - application().gotoTabViewScreenSlideTransitionEast();0 B- o( l% `# `7 H
- }7 r8 k9 ? z p( m* m
- else if (&src == &ChartARTViewButton)
* {% K* k3 Q0 F: V - {
6 F* K- a% q- a# h. z, n - //Interaction3
8 s! n% l! F0 E4 l - //When ChartARTViewButton clicked change screen to ChartView
1 e( ] @ c& ]1 G) u v) A4 i - //Go to ChartView with screen transition towards East
- l3 \) d: C6 g+ V2 o - application().gotoChartViewScreenSlideTransitionEast();
. m# ]0 C$ V- ]4 I% n' l - }5 R! K$ S& M- X) c
- }3 {* G# |" M+ s. \, m* F0 [
- / }7 D6 f v4 h% I
复制代码 , u, @1 g; w8 b: o9 d
由此可以看到创建的界面后,base文件中的状态。下面会给大家展示一下view文件中的内容。2 a7 X& h, j4 \; Z0 q$ b
3 ?& m& g2 M8 K* G$ O8 z, x' c* t$ _+ k
View类的作用
* p$ i+ {4 @( g- T* c3 pview中的内容是可以进行修改的,可以根据需要添加自己的使用方法。
' J, {9 a/ u& u9 N下面我们再看一下MainWindowView.hpp文件。
7 P4 V2 e- S# {9 l- #ifndef MAINWINDOWVIEW_HPP
. p+ z9 S) _9 Q5 l - #define MAINWINDOWVIEW_HPP
* b! s+ |8 K) [8 e4 w
( [$ r; ?: E; D% s- #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
. l9 O4 M! _( G$ g Q - #include <gui/mainwindow_screen/MainWindowPresenter.hpp>0 C( G) f9 m, d; C9 _
- # b6 f* _6 F# I8 O a5 m
4 }# r4 L; V" L7 u- class MainWindowView : public MainWindowViewBase这里看见这个类是继承上方的基类MainWindowViewBase
- x0 |2 \, ]; n3 U0 A - {
( {# [5 J1 H; _* w7 g4 M O - public: \2 n4 u' T9 ~: E# @' k% r, V/ f
- MainWindowView();+ M/ s0 b6 S$ r& \0 {1 N1 K: p
- virtual ~MainWindowView() {}3 ^ y. G3 F! c: o1 k
- virtual void setupScreen(); 正常创建时,到此处就没有了。0 e) ^* L- a K7 a! Z
- 下方的文件是手动添加的,如果在界面上创建了function函数,9 @, w/ j5 h% k. P5 b* \- g% d! M
- 则在该文件中添加一样的虚函数,具体在上方的base中能看出来。4 E$ \3 N. n/ b
- virtual void tearDownScreen();
+ z! Z4 W" I7 u# C" `0 }3 W0 a& x8 `; l - virtual void setBackImageIMG();
& L! x9 ?; V1 F/ O& E. |# \: R - protected:
# B5 w- A3 i1 a" [, x% ~ R - 7 L2 c; x/ d7 w( R( `
- };6 N+ D5 x6 o- ~" M4 n4 V) H- V
- 5 ^# S$ W& W6 C+ c
- #endif // MAINWINDOWVIEW_HPP
! J5 [$ N7 b @7 C4 h/ U4 {
复制代码
( A' W0 J, z% T/ h3 m& O( @. M, {8 i此时就可以在cpp文件中添加相应的函数实现了。$ _8 [/ I8 _# e% f% L
% P% c9 I0 r5 m4 |
按键事件响应逻辑: ~$ B t3 { B
好了说了这么多,我来给大家总结一下吧,通过TouchGFX Designer创建一个界面,在界面中可拖拽控件,在TouchGFX Designer下也可添加相应的action函数,在添加完函数后,要在view文件中加入相应的虚函数。% W) j( Z0 E% E+ K" d# u, \ p& ^- u
除此之外,还可以模仿base文件的方法在界面类中添加相应的button及button的action文件。此章给大家介绍了创建事件的注意示项。% K# f6 u; H( d6 P5 |9 z% \. s
————————————————
' J9 m( i. ^9 b- r& I$ Z版权声明:空闲的程序员
8 N1 D3 D# B% V( g7 z% g2 ^4 g2 G: W' S
0 ?( F/ y) `: f3 a Z+ C' v |