查看: 3507|回复: 1

如何理解TouchGFX中的Screen和MVP框架模式

[复制链接]

658

主题

659

帖子

2079

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2079
发表于 2019-11-22 09:54:59 | 显示全部楼层 |阅读模式
Screen 概念
$ S" R* \2 k! F% l3 F
& D8 ~0 g( U/ D在TouchGFX应用程序中,开发者可以根据项目需要创建任意数量的Screen。这里的Screen是指UI元素(控件)及其相关的业务逻辑。一个Screen通常包括两个内容:一个View,涵盖该Screen上显示的所有控件;一个Presenter,涵盖该Screen上所有的业务逻辑。% W; ^& e' @6 r% F* B
: ~+ C4 H! p; n
你可以选择只创建一个Screen来实现整个应用程序(这意味着此应用程序只有一个View和一个Prsenter),但是对于复杂一点的程序,我们不建议这样做。出于以下两个原因,我们建议将与UI的无关部分分成不同的Screen来实现:
* y0 H, X3 ~8 \% Y5 q1 e% C5 S$ R/ N1 O! D- g
1. TouchGFX有自己的内存分配方案,它自动分配最消耗RAM的Screen所需的RAM且只分配这个内存,分配的RAM可以在应用程序的所有Screen上重用。$ Q2 z+ I' j5 ]/ m
; l0 o, L2 Q  T' T) W) u/ _; E+ n
2. 拥有多个Screen,UI代码更加易于维护。
6 j. n! p% u& b+ I% ~) T
6 x% J0 g# |+ \; ^+ j( p. b定义Screen. W) T& \: P2 {

2 A+ r! V4 |0 T关于如何将一个应用程序划分成多个Screen,并没有确切的规则,但是有一些办法可以帮助你确定应由哪些Screen组成特定的应用程序。5 J' t5 V. S( T  m# h
: I# J: p; [. F2 m0 ?) N
在外观上和功能上不相关的UI应放置在不同的Screen中。举个简单的调温器例子。这个调温器应用程序只有一个温度显示界面和一个设置界面,首先我们为温度显示界面创建一个Main Screen,然后为设置界面创建一个Settings Screen。Main Screen的视图将包含一个背景图像的控件、一个显示温度的文本区域以及一个用于切换到设置界面的按钮。另一方面,Settings Screen视图可能包含用于显示设置选项列表和不同背景图像的控件。如果设置界面需要编辑许多不同类型的选项(日期,名称,温度,单位等),那个这个Screen的复杂度将变大。在这种情况下,可以考虑将设置界面进一步分成多个子Screen,此时Settings Screen相当于整个设置菜单选项的树干,而它的子Screen可以用于编辑特定值。4 J! N4 c& ~- q/ {1 @3 R" p9 h
; i" W! f0 ?, F  r8 ^
由于TouchGFX是用C++编写的,因此你可以选择在Screen中利用面向对象的范例。比如,如果你的所有Screen都需要在顶部状态栏显示当前时间、电池电量等信息,则可以创建仅包含状态栏的基本View,并使所有View都源自该类,自动添加状态栏功能。
1 F4 h9 y( j' u7 `
2 E3 h- F4 o2 d# y: Q) Z$ Q" d当前活动的Screen
8 d% l- j- A) Y, b- W" h; a
6 B7 l5 B: m7 S( o2 I! `8 h' {由于TouchGFX为Screen分配内存的方式(仅分配给最大的View和最大的Presenter),一次只能激活一个View和一个Presenter。因此,如果调温器应用程序正在展示温度显示界面,那么设置界面的Screen并不会运行。
$ C8 m& n9 a, I/ y" x" o+ @; i. J1 T! \5 ?
如果事件是从“后端”(执行调温器实际工作的所有非UI代码)或硬件外围设备接收的,那么可以将这些事件委托给当前活动的屏幕。这就是关注点分离,因为某些事件仅对应用程序中的某些Screen有意义。例如,收到事件通知当前温度的变化可以通过Main Screen处理(将更新文本区显示变化后的当前温度),而Settings Screen可能会忽略此事件,因为在Settings Screen不需要显示温度。$ {1 o# a: a6 w
+ O% @$ y# |0 n) |
MVP框架模式
+ S. D0 u. b; m; {0 M) ~( K5 ~2 W8 t; l' X7 u  g* }: k
MVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Presenter负责逻辑的处理。在MVP中,View并不直接使用Model,它们之间的通信是通过Presenter 来进行的,所有的交互都发生在Presenter内部。MVP是在UI应用程序中划分职责的一种常用方法。
' ^# O; l4 D9 E1 m9 K* b/ L1 i
. D! ^, g+ }. H下图说明了TouchGFX中的Screen概念如何与整个Model-View-Presenter框架模式联系在一起:7 Q- `, {7 n- F% A0 _" ~# v3 }4 a

4 r% K( E% v9 G+ s
0 @# {) }9 \% b9 Z1 P+ i3 M' v& {" z4 z
4 R* z9 A% N; s1 _- X
Model, e8 j+ {, ~% }9 F  B( Z8 U# L

9 [4 n* C+ R  k+ ~$ BModel类是一个单例,始终处于活动状态,并具有两个目的:
4 _/ l/ l1 W: M. X/ n
# f0 H5 t) }/ |9 J9 s$ t1.存储UI的状态信息。切换Screen时,View和Presenter被释放,因此它们不能用于存储应在Screen切换期间保留的信息。因此,需要使用Model来存储UI的状态信息。% x2 c% O4 p0 S# M- {% Q
2 t- G3 w1 r, b6 {
2.充当与后端系统的接口,在当前活动Screen之间来回传递事件。
' V. N; D& t0 k2 ]0 F
8 t% G7 I# j0 ~Model类有一个自动设置指向当前活动Presenter的指针。当Model中发生更改时,会将更改通知给当前活动的Presenter。这是通过应用程序的Model Listener接口中的方法实现的。- q! s5 e8 m8 E6 ?/ E
4 R) r  J$ C5 h7 a
View. S) z0 P0 l; P  h1 A

. V- F5 ?1 h5 y) W! I- fView类(或更具体地说,是从TouchGFX View类派生的用户定义类)包含在当前Screen显示的所有控件。它还包含一个setupScreen和一个tearDownScreen函数,当进入/退出当前Screen时,该函数会自动调用。通常,你可以在setupScreen函数中设置控件。
. H) G( v$ d7 X! Q3 P+ X* U' V' F7 O- U) s- j; j% b7 M
View还包含了一个指向关联的Presenter的指针。该指针由框架自动设置。使用此指针,你可以将UI事件(如按钮单击)传递给Presenter。. ~0 N2 Q0 X/ {" ]7 y. E# q7 e

5 V: Z' n/ {9 T* B8 mPresenter  u5 i4 C' Y5 s5 W8 w2 z

) K" B: i6 s+ ?, MPresenter类(也是从TouchGFX Presenter类派生的用户定义类)负责当前活动Screen的业务逻辑。它将接收来自Model的“后端”事件,以及来自View的UI事件,并决定采取哪种操作。例如,如果从Model接收到警报事件,则Presenter可能传递给View显示警报,弹出对话框。9 B1 V3 X1 Z" [0 ]- _

7 ?& K, d  l- i2 h1 k, n" [$ YScreen过渡' h: Q6 R6 s1 h7 ?
& \0 D- W! W0 s' M& ]  v; l9 L! G% A
使用TouchGFX,开发者可以实现从一个Screen过渡到另一个Screen的动画效果。默认的过渡效果有两种,NoTransition和SlideTransition。NoTransition可实现从一个Screen到另一个Screen的即时切换,SlideTransition可实现水平或垂直滑动切换到新Screen。你可以根据自己的需要,自定义创建过渡效果。
' m6 _$ s3 l: M8 t0 Z1 S! B  r8 X2 b1 k+ e# x7 H, D
小结
& h4 g! S( l+ J+ g! L
5 v7 x$ u6 k; `" M7 B. k, f在MVP框架中,所有数据只能保存在Model 的类对象中,Presenter是View与Model之间的纽带,View只能通过Presenter来读取数据,而不能直接读写Model中的数据。3 M9 V* @! O4 a9 ?" k. L: m
2 w8 }# y2 H  A( g( y0 C
事实上,Presenter将Model和View进行了分离,主要的程序逻辑在Presenter里实现。我们可以随意修改View而不影响Model。同时,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时可以保持Presenter的不变,也就是重用Presenter。此外,我们还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试,而不需要使用自动化的测试工具。
/ d: p: t0 E  D5 M/ A3 o
* k" W' P+ [  u9 Z在使用TouchGFX进行GUI开发时,理解MVP框架模式非常重要。那么,你掌握了今天的内容吗?欢迎留言交流。& S( J% A$ Q) h/ _6 |# F  K- K4 Z( L
. C. @: [  y1 t6 ]- ?

) Q! U* a# Z! U2 X+ ~8 Q5 Y2 s+ n
$ e4 z9 c4 O" b2 n, a( A0 B
* b  d: g1 Y6 [- G9 G: r参考资料:
3 |* a: s/ E; [' v. r- B5 Q【1】https://baike.baidu.com/item/MVP/37145503 ?& E. s: C6 P5 l# X

5 y+ ]+ O2 ~; G

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

3

帖子

34

积分

新手上路

Rank: 1

积分
34
发表于 2019-12-17 19:10:33 | 显示全部楼层
顶一个  好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

保留所有权利 @ 2019 TouchGFX 使用条款 | 销售条款和条件 | 隐私政策 | Cookies管理 | 行使您的权利 | 沪ICP备18033411号-2

快速回复 返回顶部 返回列表