通过TouchGFX创建事件逻辑函数! d+ T& q2 |! t$ b# b C: y
TouchGFX Designer中的交互由触发器和动作组成:/ S+ \9 w9 g0 @) X
触发器:是由用户点击或者进行其他操作后产生的信号。
% ?7 Y. b: }: p) @4 `& i/ d4 D动作:由触发器触发的相应的事件逻辑。2 k. D5 \3 Z$ {* n9 `+ l& Z
要添加interaction ,请转到任何屏幕或自定义容器的“interaction”选项卡,然后按下标有“Add Interaction”的蓝色按钮,如下图所示。& a, |! B3 x& P1 k
2 f# ^! c, i+ o* Q; K a
# ]$ {) |, M, f2 A9 @% R; T& f- A7 s, {! Z' e
添加后界面样子如下:
, S7 u3 f& e& ~9 x' e2 f. a6 X/ D6 |- P( c( U/ A
! b8 j- Q! w8 ~7 g
T; n6 L+ N. x& t. F- ?: b7 ^2 ^; LTrigger中用于添加触发器类型,例如:按钮点击事件。Choose clicked source 中添加被点击的是哪一个按钮,这里显示的是“button1”。" u8 `$ k' x8 k7 `6 d4 l, b
Action:action的操作分为了两种,第一种是作为基础窗口的动作:0 Z/ ]1 g2 w8 Z
该种动作包括:
3 t( R# ^* D W- h2 e& }) y# h k7 f& b, ^
0 [* ?" X X& S* \4 K3 T0 J u
8 B* |; F1 O9 o( i, o& `
第二种是控件的属性提供的动作:( ?2 L7 ~' D% B& l2 [$ u
/ W1 E2 p& i& d2 x' u' x
5 e& h5 b4 y2 K1 p) B
. H. p2 Z" P {# }; A: r在上图的底部存在Can trigger another interaction的复选框,它的作用是连续动作,当一次触发事件后多次响应其他的事件。7 c! k U+ G/ d# _
4 A n$ u* H! [
Base类中的秘密
0 G9 F! g7 @3 c, h1 ~* Z$ P在通过TouchGFX Designer创建完界面,并在界面中添加完相应的触发器后,生成的代码中将会存在相应的界面基类,这类代码是由TouchGFX Designer自动生成的,所以不建议更改,在第一章也和大家说过,下面我们探索下这个类中有些什么:9 S$ a. c2 c& V, A8 T1 B0 K
我们以我写的一个例子做讲解,该demo源码在第一张中可下载。看下图
: j# t, C6 ~/ B6 X7 l. K6 i8 J8 `2 Y5 E' ~, h1 _
5 e4 c1 X m- S! u7 C, Z9 W) h
) ?& H+ J' `. C1 Y( e8 p3 ?) _
我们以MainWindow窗口作为例子讲解窗口基类中有哪些东西,首先窗口的名字叫做“MainWindow”,其中包含和三个按钮及一个text area还有一张背景图片Backimage。放置的顺序不同在界面上体现的层次感不同,如果将背景图片放在最上层的话其他按钮都将被盖在下面。其次看右侧的interaction,在其中我添加了三个逻辑,类型都是按钮的点击事件对应的是三个按钮,相应的功能是“Call new virtual function”,在下方写了函数的名字。注意函数名字和控件的名字,此时,点击Generate Code 按钮后在VS中打开工程。可以看到在头文件和源文件中generated/gui_generated文件夹下有mainwindow_screen文件夹存在,在该文件夹下将存在该界面的基类。如下图:* Q) d' {& u) K4 Y; f: p* b
) R& E& R* B5 Y" S7 `! F
% H8 K! V& s+ r0 B. H: G7 C
0 [* K5 V ]+ X6 M$ E7 d8 I我们看下该类中的头文件:
1 J* |0 @: `8 z4 l- k y- /*********************************************************************************/
, x/ [2 F" g/ H% E/ j - /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/1 E, w7 f% P ^6 @! ^ e( ~
- /*********************************************************************************/ x" j- u5 ^6 k$ f
- #ifndef MAINWINDOWVIEWBASE_HPP
* M' N# Y% M" C( a% Z - #define MAINWINDOWVIEWBASE_HPP# H1 S" H" x2 g l( M
- : ^6 ?+ v* l* |9 m
- #include <gui/common/FrontendApplication.hpp>
7 Z$ S+ k+ `) }& Y& l; ^8 [: W - #include <mvp/View.hpp>
3 i) A+ L) @# D+ W - #include <gui/mainwindow_screen/MainWindowPresenter.hpp>
, E9 G: L+ @7 B) p$ s - #include <touchgfx/widgets/ScalableImage.hpp>( L! p* r" M( d7 `* j
- #include <touchgfx/widgets/ButtonWithLabel.hpp>
' x) z# _1 E3 g: u, g2 j3 w, D - #include <touchgfx/widgets/TextAreaWithWildcard.hpp>
8 }) o! |4 G% D1 B o - #include <touchgfx/widgets/Button.hpp>
?9 e) G0 J2 `0 a9 B" U - 8 b1 I" @# D9 M# h
- class MainWindowViewBase : public touchgfx::View<MainWindowPresenter>
, [* x0 S7 k( K7 V7 f& `- z - {* w. L5 _+ F7 ~9 n+ v
- public:
( W \8 ? E* ?9 n. L. J0 H5 I9 c! u - MainWindowViewBase();
" A; U( M2 T' N: O6 } - virtual ~MainWindowViewBase() {}/ J7 l% E( k; v* H" c2 k7 G
- virtual void setupScreen(); 窗口创建时响应的函数* b) {+ z$ p3 L
e9 |- P# d9 t0 Z" M- Q- T; _: l- /*
+ G" i# B+ z2 N7 A - * Virtual Action Handlers
( N( K1 J+ r! A. q/ X5 ~8 _ - */: [4 H" K6 g% Q* x+ @9 k9 j
- virtual void setBackImageIMG() 这个就是在TouchGFX Designer中function name 中填的名字他就是Designer产生的关联性。. ]# f# f: X1 s4 y! c0 A
- {# G" J, X$ [6 X6 M- J+ ^3 \2 `5 D
- // Override and implement this function in MainWindow8 v7 R% _+ u8 Y
- }
3 ^4 a/ d" V4 Z7 h Q6 D - " B+ X* ^. h3 ]3 r/ s
- protected:
7 H, v. O2 I0 w8 z. ~; Y - FrontendApplication& application() {
2 o3 P; J. t" m0 d4 R, _6 P - return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());& }% m8 H( A5 M+ o/ ?
- }
7 y0 v% z% o. `
2 Q, M8 C% k) J, b9 X- /*
# f* ] I6 H" z [" S# {1 [) Q2 w - * Member Declarations
3 y: W# L' g' ~7 ?( k( r - */
3 @8 |; |6 E% V( ] - 这部分放的就是界面上控件的名字,也就是说如果想要修改控件的动作或者状态,除了TouchGFX Designer中修改外,也可以通过代码调用定义修改。; B- o( P8 L4 b+ V7 B- {
- touchgfx::ScalableImage BackImage;
2 ?# @; W2 i+ G% g4 _7 ]3 C - touchgfx::ButtonWithLabel ChangeImage;7 i4 J6 a. ?) M. H
- touchgfx::TextAreaWithOneWildcard textimageid;, R& [- O: z. P& H# P& K' S4 l( @$ c5 D
- touchgfx::Button NextView;
* E6 ?. d% ^$ l5 X* Z - touchgfx::Button ChartARTViewButton;' r0 o# K0 m( X
- : i6 u3 S1 c/ G1 T. ?) d- N% b
- /*; x2 Y" P/ q# D: O: \. P
- * Wildcard Buffers' y7 q) Z6 J7 H) _
- */( N. C: `! ^( G& m! f7 u
- static const uint16_t TEXTIMAGEID_SIZE = 3;, p% I; q8 n$ `/ k7 ^. y# G
- touchgfx::Unicode::UnicodeChar textimageidBuffer[TEXTIMAGEID_SIZE];& Y. R& Q2 [6 v8 {( W% t5 H+ x7 r$ D) \" @
: [0 y" S* k9 n5 W2 r" \! X- private:
1 b" q2 @* ?* d7 A, F0 F - 这个部分就是 通过TouchGFX Designer中interaction响应的逻辑,具体的一会在cpp文件中将会看见。
! b. g6 k: C |% W5 G - /*
& c& e+ a* d5 I. ]: D6 r3 ^ - * Callback Declarations( G& c+ Y: K: Y$ J5 q
- */
# E" j. Y+ K( e+ y - touchgfx::Callback<MainWindowViewBase, const touchgfx::AbstractButton&> buttonCallback;) P1 r* _$ q. Z# C# ?! V |
- - r s9 a& t- d1 B' `5 v
- /*
, L/ z8 C, U9 I1 L& w - * Callback Handler Declarations
$ f. r! y' \8 \0 p* S - */$ K+ V4 \3 }$ X( j2 q H& R
- void buttonCallbackHandler(const touchgfx::AbstractButton& src);
: x# G% r1 h- ^
; p) u6 y' D2 y; H. X; E- };
5 h; P" t# M) ~ _ - ; n. ]; j2 ]( {/ b1 j
- #endif // MAINWINDOWVIEWBASE_HPP% _: Q3 W4 i; X1 y
- 0 G6 O! j" L5 ?0 \ ~
复制代码 " z' y! u6 Z1 n( z3 e+ v5 j
到这里MainWindowViewBase.hpp文件参观完了,可以接下来参观cpp文件了。
6 k/ [9 D, T- \- Z( C8 U4 g6 w- /*********************************************************************************/
9 c) y! V, M2 k( n# z - /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
: g) {: `# Q1 s- Y2 M" x0 k, b) ` - /*********************************************************************************/
; {% B0 O9 L- b. N4 T$ { - #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>4 t, G; `: r9 ?
- #include "BitmapDatabase.hpp"
3 ^, ~$ H2 `. Q - #include <texts/TextKeysAndLanguages.hpp>
; w4 A3 {9 }4 l( B5 q; ]0 k7 ^! r3 A - #include <touchgfx/Color.hpp>
! t/ i* i7 ?+ L7 F0 ?$ L5 C
/ C4 \ ^' d, @0 _- t- MainWindowViewBase::MainWindowViewBase() :
1 G$ t- W% P: I% B: |: {7 p" Y - buttonCallback(this, &MainWindowViewBase::buttonCallbackHandler)
9 a9 C/ q; j8 I! M" G - {
' r7 H3 K3 R1 z, O- S* T: y - 在构造函数中可以看见我们添加的控件在cpp文件中体现的样子包括设置图片或者设置位置4 J& L+ E. [) s5 a' Z1 Y
- BackImage.setBitmap(touchgfx::Bitmap(BITMAP_IMG1_ID));& p, w! V5 B/ g' l t3 v
- BackImage.setPosition(0, 0, 800, 480);
, E \, ]6 \# X: n& y - BackImage.setScalingAlgorithm(touchgfx::ScalableImage::NEAREST_NEIGHBOR);
, N q* f# \' V: l - 1 e; d/ ]; ~6 s
- ChangeImage.setXY(315, 0);6 ]. h% [ m( F! Y( c/ c
- ChangeImage.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_PRESSED_ID));) h# A8 I2 [. e' `( u K
- ChangeImage.setLabelText(touchgfx::TypedText(T_SINGLEUSEID1));; y. ^' x- m9 u5 ?6 G6 i
- ChangeImage.setLabelColor(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
; Y' |: W5 n3 B8 g - ChangeImage.setLabelColorPressed(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
* z& @+ \$ }3 x* ?% v - ChangeImage.setAction(buttonCallback);这里可以看见添加action方法
' a" X+ N2 o7 _) k9 y( Z - 2 T) X6 s+ D: `' k9 O f
- textimageid.setPosition(394, 68, 26, 25);6 F! w+ L7 q2 s T2 c: ~5 o
- textimageid.setColor(touchgfx::Color::getColorFrom24BitRGB(255, 0, 0));
; k& \$ i& z) R* x9 K& f& R. H: ? - textimageid.setLinespacing(0);
* V: l% U( m4 o1 D+ U' ^+ t - Unicode::snprintf(textimageidBuffer, TEXTIMAGEID_SIZE, "%s", touchgfx::TypedText(T_SINGLEUSEID3).getText());9 p2 w& a Z* B* h$ ]: ?% ?" h
- textimageid.setWildcard(textimageidBuffer);) S3 |3 g9 C- o& F* F
- textimageid.setTypedText(touchgfx::TypedText(T_SINGLEUSEID2));
/ O) b* k# o/ M - $ a, [* C7 N c2 _
- NextView.setXY(377, 135);
' p( M) W7 I) S# Y2 C3 W( R* R: y - NextView.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));1 ?: ~8 W4 _9 d' S/ U" P
- NextView.setAction(buttonCallback);' C/ [& d- G9 M; b% _8 J7 i( x
- 3 O4 k ^7 N6 R) h
- ChartARTViewButton.setXY(377, 230);
) c8 I, p: u' `, D: l" p - ChartARTViewButton.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID)); ~: `) Y) v x2 l9 ?
- ChartARTViewButton.setAction(buttonCallback);页面切换的action函数! h6 i" D1 u* t8 N
- 在窗口上添加控件方法; ~, L. S- K- }9 _3 m9 i
- add(BackImage);
1 Q. m4 j. Z& l9 ~! R7 l, Q - add(ChangeImage);
; ?' N: C1 V o) | - add(textimageid);
( c5 t9 R* J( d0 d) } - add(NextView);: H) T3 C) \% W! ^4 F6 y
- add(ChartARTViewButton);
' j: h5 N- j8 x \) A - }
! @+ n7 l$ m" W$ o - ; k' X& @5 R4 p A% p, x( d( ?
- void MainWindowViewBase::setupScreen()
$ q/ U3 ^" o3 e2 c* Q$ c0 f - {8 ]; u, H$ z+ ~$ l) V5 Z' C+ K) R
+ p. P! [* P5 [! T- }% G( l! C8 U% }) W Q
) m+ W7 r% r* r, B% Q- void MainWindowViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src), m2 h2 T- I" L" W4 I& i" t
- { r$ Z7 X5 |( h/ E, L! ~4 Z, r, E; C
- if (&src == &ChangeImage)4 z: H. p$ j% {/ p
- {
" J0 S4 X3 m% s% d: z - //Interaction1
- r9 O5 Y/ n- F - //When ChangeImage clicked call virtual function) S2 Z5 A& g, ]& v
- //Call setBackImageIMG
/ D; V4 B; r1 m+ _ f+ G7 l( I - setBackImageIMG();这里可以看见是通过callback函数响应的setBackImageIMG函数,由此可以知道以此方法我们可以自己在界面上添加控件,而控件响应的函数也可以这样添加。注意要是自定义添加不要在base文件中添加要在界面类的函数中添加。
5 C$ r% T# H( }3 x) q% X - }
. g) H# r3 e7 P' u% J$ n$ r - else if (&src == &NextView)+ ^9 a7 O* _% ]" {2 C
- {
- W, a5 E3 U( { - //Interaction2+ e/ _" C5 N. a: q
- //When NextView clicked change screen to TabView: z0 H( L2 _4 o' T
- //Go to TabView with screen transition towards East
6 J$ s/ Z3 q$ `; ~2 S0 R - application().gotoTabViewScreenSlideTransitionEast(); p, E8 D, }( A
- }' `, m, e7 j; w+ G1 [( A/ a; o
- else if (&src == &ChartARTViewButton): G3 T. j% k4 q& K
- {
1 ]3 \) ~. M( X( y: r, B/ m - //Interaction3
# Q O6 W" j2 @( J& Q9 p4 \ - //When ChartARTViewButton clicked change screen to ChartView. p: Q" z# [' d7 l/ B7 V$ }
- //Go to ChartView with screen transition towards East- [5 }5 B! m2 {
- application().gotoChartViewScreenSlideTransitionEast();; c3 U3 W2 s" {2 o, C
- }! Y- v1 {7 Z- i5 N8 i" r$ ]
- }% @6 R0 J. U, e& [
- % D( x9 ~) \" ~ D! L0 v9 Y5 _: ~
复制代码 4 h& |$ A9 y' f; ~# P) V8 Y
由此可以看到创建的界面后,base文件中的状态。下面会给大家展示一下view文件中的内容。
5 Z5 v' p- U- H
- Y$ F0 N* ~* ?9 F$ Y+ O4 a2 @* B5 x0 Q, D' B
View类的作用$ ^1 |$ I V" }/ ]2 a; X% y& s
view中的内容是可以进行修改的,可以根据需要添加自己的使用方法。
9 @ q% O) [5 I u O下面我们再看一下MainWindowView.hpp文件。& {7 V5 i s% a9 p- i& v1 m- J
- #ifndef MAINWINDOWVIEW_HPP
5 G7 i, v/ H9 l# X/ ? - #define MAINWINDOWVIEW_HPP' z- j$ b J0 A* f# z/ i* N
' }" b7 i- y, D% }4 ^6 @- #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
$ o( W" }# T( U, k# D - #include <gui/mainwindow_screen/MainWindowPresenter.hpp>( f1 K3 N+ e- I, r" u8 ?
- . B! E9 \/ Y y/ ^+ y5 T
1 L2 h: w7 ]+ A" d! B) u: P: h- class MainWindowView : public MainWindowViewBase这里看见这个类是继承上方的基类MainWindowViewBase$ g% \8 w7 k# a; w
- {3 g: p: U! S7 D/ t
- public:
8 |: A( D" ~& m5 r6 K! G9 O - MainWindowView();* t1 y' W8 J+ L+ {) @
- virtual ~MainWindowView() {}/ |) F$ H. D5 t) @% k& Y7 S# u
- virtual void setupScreen(); 正常创建时,到此处就没有了。7 h" ]5 ^7 G; x* d1 M, F! s
- 下方的文件是手动添加的,如果在界面上创建了function函数,
, K- F. d2 a) }5 O3 f - 则在该文件中添加一样的虚函数,具体在上方的base中能看出来。2 V, e- [* O8 Z' \
- virtual void tearDownScreen();
, u" p4 N' `9 ]8 f( x& m) u. ^ - virtual void setBackImageIMG();
+ J3 U6 E, s P& y% a7 w2 \8 ~/ K - protected:" S# d1 Y' ]$ P
- 2 b0 t( Q6 @& ?2 C
- };3 u$ M2 o9 q Z
- z9 g$ Y7 I' D. q; B! x" I0 `6 Q
- #endif // MAINWINDOWVIEW_HPP
/ k2 A, a, |/ P8 V9 ^0 O2 ~1 r
复制代码
' Y6 ?4 B5 w/ q3 P此时就可以在cpp文件中添加相应的函数实现了。
; L! A% f2 S1 k4 Z1 \. J! B( e7 t5 ?/ R4 G
按键事件响应逻辑* N$ a7 X* _6 \5 p8 I) ` J
好了说了这么多,我来给大家总结一下吧,通过TouchGFX Designer创建一个界面,在界面中可拖拽控件,在TouchGFX Designer下也可添加相应的action函数,在添加完函数后,要在view文件中加入相应的虚函数。
7 ~+ N& K# I1 E" S5 p除此之外,还可以模仿base文件的方法在界面类中添加相应的button及button的action文件。此章给大家介绍了创建事件的注意示项。# X% P% l/ n0 m5 ]6 k, r
————————————————) y5 `# n5 A: A/ P
版权声明:空闲的程序员
7 ~4 z# U! R4 g q) U# W) ~1 G3 D$ X Q
$ I$ K, O) `1 Q6 j* q+ N
|