通过TouchGFX创建事件逻辑函数2 u2 ?! L3 k$ f# f) }
TouchGFX Designer中的交互由触发器和动作组成:
' f) Z( d+ X) S% _2 v触发器:是由用户点击或者进行其他操作后产生的信号。
- L; f% X2 k) m3 b+ j动作:由触发器触发的相应的事件逻辑。
2 m6 a9 f3 L- M" Z要添加interaction ,请转到任何屏幕或自定义容器的“interaction”选项卡,然后按下标有“Add Interaction”的蓝色按钮,如下图所示。
2 h& Q0 R8 Q( k8 T4 A# D& h1 @ Z* h
8 ~" K! h4 _% G, l( R
0 k7 m0 K" N3 e6 z- @0 _5 g$ I; V& d$ L/ |0 z1 z. Z. I- p; T
添加后界面样子如下:: U# X5 K' f$ ?; t+ K, |
1 A; \8 }3 |# I' e
; n8 Q+ j% u P) S
" s$ ?( O$ e2 a' h9 QTrigger中用于添加触发器类型,例如:按钮点击事件。Choose clicked source 中添加被点击的是哪一个按钮,这里显示的是“button1”。* E6 M- x. l6 O( b" Z5 m: r
Action:action的操作分为了两种,第一种是作为基础窗口的动作:
( {+ k' d% f/ q4 C/ r$ S7 S该种动作包括:+ g4 N+ M6 Q4 B. G7 v& y) O$ x
* W1 R1 p4 ~, `( v+ f8 E
0 W O$ v7 Q; c- F: ~4 I/ X) L/ i: ?9 G5 A
第二种是控件的属性提供的动作:- L% w$ R( C# h9 x5 G
! B7 F |$ E, X9 Y# _
; c6 ~* y9 \* x8 q% \3 [. a
1 f% I1 N- h5 Q: N2 i' X在上图的底部存在Can trigger another interaction的复选框,它的作用是连续动作,当一次触发事件后多次响应其他的事件。
; {8 o- d8 s( ?& G5 ^9 R6 i, J- w3 O# A3 Z" w
Base类中的秘密2 ^1 }2 y, s6 @. y) c
在通过TouchGFX Designer创建完界面,并在界面中添加完相应的触发器后,生成的代码中将会存在相应的界面基类,这类代码是由TouchGFX Designer自动生成的,所以不建议更改,在第一章也和大家说过,下面我们探索下这个类中有些什么:) T: {% q- g/ l' H
我们以我写的一个例子做讲解,该demo源码在第一张中可下载。看下图
. [6 M& g3 {; D. u. w: O- P$ }6 g" q' s7 [) I( ], T
7 m' F* o/ B! s a' i2 M
5 u5 k2 @; A- u* T6 m4 m7 j: s) @2 C n4 u. V; L- Q V
我们以MainWindow窗口作为例子讲解窗口基类中有哪些东西,首先窗口的名字叫做“MainWindow”,其中包含和三个按钮及一个text area还有一张背景图片Backimage。放置的顺序不同在界面上体现的层次感不同,如果将背景图片放在最上层的话其他按钮都将被盖在下面。其次看右侧的interaction,在其中我添加了三个逻辑,类型都是按钮的点击事件对应的是三个按钮,相应的功能是“Call new virtual function”,在下方写了函数的名字。注意函数名字和控件的名字,此时,点击Generate Code 按钮后在VS中打开工程。可以看到在头文件和源文件中generated/gui_generated文件夹下有mainwindow_screen文件夹存在,在该文件夹下将存在该界面的基类。如下图:
5 p0 @" I7 O! A, X: A4 g7 j9 w/ a: w; d b' @
1 }9 v' m3 L$ K0 s# s+ M
# B4 _/ { b0 l5 d
我们看下该类中的头文件:4 B+ w2 r7 @* g5 M, t
- /*********************************************************************************/
4 ^, j) V; M# y+ X+ J - /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
! X O0 P$ z8 o; } e0 }3 Q - /*********************************************************************************/
# X0 t* C2 u5 w- }% R0 Y, j - #ifndef MAINWINDOWVIEWBASE_HPP4 q4 _8 @, z6 o! b* Z
- #define MAINWINDOWVIEWBASE_HPP% p6 F8 ]9 B+ H4 R; D5 `" w. \
- 7 T1 ?/ W7 O8 Y. K9 X2 q
- #include <gui/common/FrontendApplication.hpp>' v5 z, e- r! ?8 Z- _+ c
- #include <mvp/View.hpp>* s, |; D- W8 [/ q6 v- C/ F
- #include <gui/mainwindow_screen/MainWindowPresenter.hpp>' @6 t" r$ o- r% u" A+ _
- #include <touchgfx/widgets/ScalableImage.hpp>; }6 s/ v# r6 X% l
- #include <touchgfx/widgets/ButtonWithLabel.hpp>
/ P( D2 v O$ t* ?, A/ c - #include <touchgfx/widgets/TextAreaWithWildcard.hpp> Y6 q5 b7 S$ n$ I
- #include <touchgfx/widgets/Button.hpp>$ G8 l8 Z3 v8 R4 V8 q) ~2 E$ ]" P* B" D
& B& R3 p/ s/ p0 S$ R3 d! j- class MainWindowViewBase : public touchgfx::View<MainWindowPresenter>
: V+ h/ n' m6 E, D" c0 W - {+ u; s/ [; p! Z6 Q6 j* ^
- public:+ [% [' O' c& ` R% s6 E5 W, X
- MainWindowViewBase();2 N8 R6 V }6 H+ U6 h0 ]$ u
- virtual ~MainWindowViewBase() {}) v3 ^( _4 a& ]1 w4 A7 `& {! @
- virtual void setupScreen(); 窗口创建时响应的函数& w! p0 {+ u. o# E( U0 [; V4 e0 g
; Y; {5 R4 X5 X& l- k- /*
( L/ U. A- u+ L6 }( Y; P# a - * Virtual Action Handlers
6 P, a B" i( g4 l+ e8 o6 L" ] - *// ?7 t# J: r! r
- virtual void setBackImageIMG() 这个就是在TouchGFX Designer中function name 中填的名字他就是Designer产生的关联性。* P% n8 H: c$ ^! l$ x
- {
8 f/ m7 B6 q1 [ - // Override and implement this function in MainWindow
1 z; v% z. [$ d& L% h( T - }" `8 T9 _ g+ i$ ~8 Y4 A" {, n
, ]9 P4 q5 `- e2 @- protected:
$ S4 n6 P8 v% [; P9 K4 h - FrontendApplication& application() {
+ ?2 N$ m; ^9 r N - return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());, L$ s6 [7 Y1 [4 a
- }" a6 P% d) J2 x9 s. ~8 X+ S
- 8 U- p. ^ D& X
- /*- U2 L9 o, w& _
- * Member Declarations
) q+ w) Q5 n: e' c/ x - */6 a2 X# I" P3 |7 Y5 j' Z I/ d8 ~
- 这部分放的就是界面上控件的名字,也就是说如果想要修改控件的动作或者状态,除了TouchGFX Designer中修改外,也可以通过代码调用定义修改。
: J/ @9 Q3 X( Y5 o! c& {9 i7 R - touchgfx::ScalableImage BackImage; / _4 N3 {5 \2 v! ^
- touchgfx::ButtonWithLabel ChangeImage;
0 ]* u( o' R2 P8 z$ d* { - touchgfx::TextAreaWithOneWildcard textimageid;
* f" A- s# g" c) ? - touchgfx::Button NextView;
2 ~& d# C: r! q$ I/ Y - touchgfx::Button ChartARTViewButton;, D9 h) J( |% _! p* {
- ) M& _9 P3 X% c; O
- /*" k2 u, F7 e' N* ?* c* Z' Z! }
- * Wildcard Buffers
7 q Z9 U8 O/ s( c9 Y - */
4 j$ f; ?# m, X0 E$ s1 ~ - static const uint16_t TEXTIMAGEID_SIZE = 3;% K! F l4 f1 C, R. M; z1 [
- touchgfx::Unicode::UnicodeChar textimageidBuffer[TEXTIMAGEID_SIZE];( @' z! k9 k: F
: p- w: f8 x+ N5 ~& M- private:5 W6 s, r9 A0 E) l$ {; g
- 这个部分就是 通过TouchGFX Designer中interaction响应的逻辑,具体的一会在cpp文件中将会看见。
, U0 G% ~- i3 r. ~0 A* A4 i5 M - /*
7 \2 b( t( x( t* E - * Callback Declarations8 _/ Q& R7 f/ p5 \
- */
# z1 z& T0 H5 o* v, _9 t - touchgfx::Callback<MainWindowViewBase, const touchgfx::AbstractButton&> buttonCallback;. V) `0 C% ]! a7 O6 q% U
- # {$ u A% H* Q" v! Q. f1 Z
- /*
( a" x/ P2 s1 g, x - * Callback Handler Declarations8 t( y# |" M: b1 e, Y1 U
- */, X4 `( f0 _( i& I' @: n
- void buttonCallbackHandler(const touchgfx::AbstractButton& src);
# x& J- C" A% e7 P) L$ r0 F) x - 8 Y" u' t6 ^9 P
- };
# P- a$ ~3 D; E9 k f7 w9 B( } - ' H! v. p) b# V6 Y4 |
- #endif // MAINWINDOWVIEWBASE_HPP1 m" B6 ~6 |" d$ g
- 8 G8 R0 b% O2 f2 t7 W; v
复制代码 9 D; {: H3 r) T. w' z% n
到这里MainWindowViewBase.hpp文件参观完了,可以接下来参观cpp文件了。
2 |# w5 |+ Z8 `8 O0 T+ f- g- /*********************************************************************************/
& ?$ j6 l. O) F! u7 i - /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/% F: E. d8 ~ M" ~3 x
- /*********************************************************************************/
+ U6 y, |( e, E - #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
! p4 ~& ?) n- V0 O1 { - #include "BitmapDatabase.hpp"
; t- o; U3 D5 {/ U6 c( E - #include <texts/TextKeysAndLanguages.hpp>3 _' Y { ~5 |: T. T2 `4 S* K
- #include <touchgfx/Color.hpp>7 o0 L) E" T4 F4 |
- & D- c( j. ~* u( R9 y
- MainWindowViewBase::MainWindowViewBase() :8 i4 U4 {6 o# w" J {* p: V
- buttonCallback(this, &MainWindowViewBase::buttonCallbackHandler)
( m, d/ g9 n" S - {
5 E: G% C( u1 `" e* Z) q - 在构造函数中可以看见我们添加的控件在cpp文件中体现的样子包括设置图片或者设置位置
; @+ j% v) F5 x3 Z6 \$ b$ A - BackImage.setBitmap(touchgfx::Bitmap(BITMAP_IMG1_ID));
1 X- s6 c; Q' `, | - BackImage.setPosition(0, 0, 800, 480);3 C/ |" P- W1 y* T7 c
- BackImage.setScalingAlgorithm(touchgfx::ScalableImage::NEAREST_NEIGHBOR);
L% _4 }8 {/ x& N/ w* P0 ` - 1 z$ ?) @7 _6 k' O
- ChangeImage.setXY(315, 0);
1 Z: C( G2 s& u* G8 U! R8 z R - ChangeImage.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_PRESSED_ID));
; ~9 Z. Y! R4 `* Y8 Q6 ~ - ChangeImage.setLabelText(touchgfx::TypedText(T_SINGLEUSEID1));' a! \# K5 J+ ~2 }3 P
- ChangeImage.setLabelColor(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));: M, c& m0 ?- H6 w
- ChangeImage.setLabelColorPressed(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));: Z7 V! c/ g) N) Z; \8 k
- ChangeImage.setAction(buttonCallback);这里可以看见添加action方法& f! r9 U* w: a! ~6 C1 Y
- , k+ }3 E! O$ X1 W% N! D' z
- textimageid.setPosition(394, 68, 26, 25); i4 Z. E( Y' W/ H+ J! k
- textimageid.setColor(touchgfx::Color::getColorFrom24BitRGB(255, 0, 0));
3 y0 f; l, w' \. \- K- ` - textimageid.setLinespacing(0);/ n/ A5 K# D7 i3 A
- Unicode::snprintf(textimageidBuffer, TEXTIMAGEID_SIZE, "%s", touchgfx::TypedText(T_SINGLEUSEID3).getText());9 i( ?" Y2 `* A2 \& I8 n9 c7 s2 P
- textimageid.setWildcard(textimageidBuffer);" }; y; w5 T; J9 U9 T5 l I9 p
- textimageid.setTypedText(touchgfx::TypedText(T_SINGLEUSEID2));
. {- E9 B3 Q! _$ u+ H: Z* \8 s
; s8 p" E, T1 `- NextView.setXY(377, 135);* m$ M6 U$ l8 q: Y7 ^* [
- NextView.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));
1 p- o- g5 O' Z, |* S* A/ l' v - NextView.setAction(buttonCallback);
( S y( J( Q9 [' M; ^) P; P
6 G9 Z" O j2 y- ChartARTViewButton.setXY(377, 230);% Y% z O: M7 Y0 U- X3 M0 m* {
- ChartARTViewButton.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));
9 F" t' u- q7 @' h. w4 M - ChartARTViewButton.setAction(buttonCallback);页面切换的action函数
( F4 i+ Z1 ?2 T. S$ Q$ r$ ]9 b5 x$ J- L - 在窗口上添加控件方法+ x# w8 y: y" |+ s% _
- add(BackImage);
8 _- n: q2 X* e3 D2 G5 Q - add(ChangeImage);% W+ a6 C5 A' N. M6 f1 p
- add(textimageid);& v' a7 T, a) Q* w2 }
- add(NextView);
: j `! A! E8 A( J$ P - add(ChartARTViewButton);
8 P, I! ]& a b+ |0 W; G - }7 @2 y$ H6 ?; a- G. b
4 i D9 R# @" _ T! h- void MainWindowViewBase::setupScreen()
8 N( d# {5 V! a- f/ J+ S - {' ~; v4 g4 u" {+ I4 p+ z* {- G
2 p4 a2 |9 x/ j2 i0 Y- }8 b- R+ s+ X' V8 e* C
- " }4 ^1 `5 J7 g# d
- void MainWindowViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src)
- J+ T- D, p7 e$ x- a# q - {
3 k# N I& r' T. i - if (&src == &ChangeImage)5 t% B8 u! C7 ~( C
- {3 m' q0 N+ v4 z$ X0 G5 T
- //Interaction1; x, C9 z" P' x7 x. k
- //When ChangeImage clicked call virtual function) S( }$ W. T4 `) D- `# u
- //Call setBackImageIMG
% I" g9 K$ @: O4 M - setBackImageIMG();这里可以看见是通过callback函数响应的setBackImageIMG函数,由此可以知道以此方法我们可以自己在界面上添加控件,而控件响应的函数也可以这样添加。注意要是自定义添加不要在base文件中添加要在界面类的函数中添加。
4 C5 a$ h( B( Q# \0 p' w/ {! E - }
# R' u( k3 r: e5 u* f+ _ - else if (&src == &NextView)2 Z2 \: h% s8 X3 b, J8 x
- {4 |% m: O3 }+ s& W
- //Interaction2
0 h. a* c6 ^2 p3 M) n) S - //When NextView clicked change screen to TabView5 S+ {1 w0 v# _3 s9 L h
- //Go to TabView with screen transition towards East8 }" [: y. ?* X7 }' E3 o' R6 T
- application().gotoTabViewScreenSlideTransitionEast();
/ z7 I1 d! v7 Q0 a+ X2 J - }
3 R7 M1 {! q5 I5 x% `; X - else if (&src == &ChartARTViewButton)8 q @6 D; f2 w) s k+ J
- {
" U, v2 w F4 F/ B0 K6 j - //Interaction3
) F b0 C# f6 T! x6 i$ _4 t - //When ChartARTViewButton clicked change screen to ChartView; ] A) F& H. O8 N
- //Go to ChartView with screen transition towards East: j# L6 ^4 y/ E( r& L3 r" @, R
- application().gotoChartViewScreenSlideTransitionEast();
9 X9 C( z% r8 `8 m - }
) s2 o6 H, W5 [+ ?0 ~% |: X5 E) i9 O - }' ? t- X" }0 j
- * C- u9 t1 f: b
复制代码
8 y) c; T0 Q' H9 P由此可以看到创建的界面后,base文件中的状态。下面会给大家展示一下view文件中的内容。
4 H( P0 U- q& I0 q' p- a
7 I9 @" Y5 `; h I$ V
6 b0 d: z8 l* EView类的作用
* y) @7 z) s3 T& N9 Fview中的内容是可以进行修改的,可以根据需要添加自己的使用方法。
9 N, @/ L5 N) _* ^) h+ [8 b下面我们再看一下MainWindowView.hpp文件。
1 f( X: O: G0 I% s6 @" O- #ifndef MAINWINDOWVIEW_HPP
3 c1 Q6 H! t/ U8 M! z6 s, T0 I - #define MAINWINDOWVIEW_HPP0 c% |) Q, I- k; y; R3 }
- ! x, ?, z2 g4 H% Y, K/ M( G
- #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>0 Q" d+ i3 |+ `- e5 a: ?1 o
- #include <gui/mainwindow_screen/MainWindowPresenter.hpp>
5 |3 ~. q( I3 p8 X# Y0 t( Z
# a/ l& k$ @8 l/ O9 l- p
! L4 q3 e: ?0 j; g% ?- class MainWindowView : public MainWindowViewBase这里看见这个类是继承上方的基类MainWindowViewBase
" m$ Q: M& i2 V$ C* @! I @# ? - {& s5 b2 w! V8 Q" ?5 \
- public:/ s' T, T9 Y$ P# v5 P3 X2 G* Z/ y
- MainWindowView();
. c) e9 v& C! S5 ]: Q1 u' ]9 Y - virtual ~MainWindowView() {}
; F7 h' G: H. W3 h - virtual void setupScreen(); 正常创建时,到此处就没有了。8 L; I/ f; |4 y+ @3 ~6 ^. ]
- 下方的文件是手动添加的,如果在界面上创建了function函数,( I% h6 ?7 I! t3 t
- 则在该文件中添加一样的虚函数,具体在上方的base中能看出来。( ^% E4 P9 @! s H l6 b% M
- virtual void tearDownScreen(); z D; \6 r4 I( J* [- e3 J
- virtual void setBackImageIMG();; U1 p2 F7 Y0 t8 R' V9 \
- protected:, @: I7 t3 w( O% d& E
- % V0 T8 d4 e1 k1 ?
- }; A/ G# r- h9 F, [+ K
; s9 p X7 `+ N# ?- #endif // MAINWINDOWVIEW_HPP
# r* z# H' p6 y$ N: V3 v: A5 g
复制代码
( |# ^; {: j7 F1 N9 Y此时就可以在cpp文件中添加相应的函数实现了。
a [6 `+ B, a( a$ n I) K+ u6 k" v n& y' s6 |0 B: U- c* ~. s) P! N
按键事件响应逻辑
8 Q6 L) `; W7 |1 G3 V好了说了这么多,我来给大家总结一下吧,通过TouchGFX Designer创建一个界面,在界面中可拖拽控件,在TouchGFX Designer下也可添加相应的action函数,在添加完函数后,要在view文件中加入相应的虚函数。, S, b& \' ]( M5 e7 }7 u
除此之外,还可以模仿base文件的方法在界面类中添加相应的button及button的action文件。此章给大家介绍了创建事件的注意示项。% f/ ?" e+ ]. ?! l8 G6 q( P
————————————————
6 k& K' K& |: _& d. C u版权声明:空闲的程序员
3 c5 @/ U4 b4 S. f/ G5 g4 Z
' }. U- V1 x& \. N9 }) v, l
6 [& n k; ?1 S: Y8 v |