查看: 2538|回复: 1

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

[复制链接]

658

主题

659

帖子

2079

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2079
发表于 2019-11-22 09:54:59 | 显示全部楼层 |阅读模式
Screen 概念
+ `- y* @; W6 A$ h" {  D6 z& u. _0 `0 i
8 U9 e( m* D, ^1 [9 Y$ B! T; O, Z在TouchGFX应用程序中,开发者可以根据项目需要创建任意数量的Screen。这里的Screen是指UI元素(控件)及其相关的业务逻辑。一个Screen通常包括两个内容:一个View,涵盖该Screen上显示的所有控件;一个Presenter,涵盖该Screen上所有的业务逻辑。
3 Z! R& K& N$ H: G" @" o4 b+ v8 v* D/ R. W3 c) [
你可以选择只创建一个Screen来实现整个应用程序(这意味着此应用程序只有一个View和一个Prsenter),但是对于复杂一点的程序,我们不建议这样做。出于以下两个原因,我们建议将与UI的无关部分分成不同的Screen来实现:
4 o& t- f7 s+ M" c% B! S
/ R9 d5 [0 f( u' t+ I- m1. TouchGFX有自己的内存分配方案,它自动分配最消耗RAM的Screen所需的RAM且只分配这个内存,分配的RAM可以在应用程序的所有Screen上重用。9 _, ~  n# s. [3 ~, e; f

" @& O% `: ?  t9 F2. 拥有多个Screen,UI代码更加易于维护。
- K& X  j# \. x4 {$ q. h9 ^; ~1 K6 V' V' |, u. N
定义Screen' o7 J( j8 q2 {* C9 g; |

4 o% [! \4 v+ [  S. a9 Y2 q$ I4 B关于如何将一个应用程序划分成多个Screen,并没有确切的规则,但是有一些办法可以帮助你确定应由哪些Screen组成特定的应用程序。2 u: v' ^& g$ L- X, a6 {. I; [0 K

# A* n6 Q; l4 W7 L2 `5 N在外观上和功能上不相关的UI应放置在不同的Screen中。举个简单的调温器例子。这个调温器应用程序只有一个温度显示界面和一个设置界面,首先我们为温度显示界面创建一个Main Screen,然后为设置界面创建一个Settings Screen。Main Screen的视图将包含一个背景图像的控件、一个显示温度的文本区域以及一个用于切换到设置界面的按钮。另一方面,Settings Screen视图可能包含用于显示设置选项列表和不同背景图像的控件。如果设置界面需要编辑许多不同类型的选项(日期,名称,温度,单位等),那个这个Screen的复杂度将变大。在这种情况下,可以考虑将设置界面进一步分成多个子Screen,此时Settings Screen相当于整个设置菜单选项的树干,而它的子Screen可以用于编辑特定值。/ S# \9 H  m0 M% Y+ \

3 E8 F4 b4 {( y由于TouchGFX是用C++编写的,因此你可以选择在Screen中利用面向对象的范例。比如,如果你的所有Screen都需要在顶部状态栏显示当前时间、电池电量等信息,则可以创建仅包含状态栏的基本View,并使所有View都源自该类,自动添加状态栏功能。; W* h9 D% E, {. a( j" R

8 W" k6 h4 j8 P; X; F' p1 u当前活动的Screen
- F7 S# H" a* d! W, M4 g" w# R9 ^+ ?9 O/ C/ J/ v$ c
由于TouchGFX为Screen分配内存的方式(仅分配给最大的View和最大的Presenter),一次只能激活一个View和一个Presenter。因此,如果调温器应用程序正在展示温度显示界面,那么设置界面的Screen并不会运行。3 P8 B6 m2 V" P8 a
5 u, x' D$ C; k* e! N: i5 }' M
如果事件是从“后端”(执行调温器实际工作的所有非UI代码)或硬件外围设备接收的,那么可以将这些事件委托给当前活动的屏幕。这就是关注点分离,因为某些事件仅对应用程序中的某些Screen有意义。例如,收到事件通知当前温度的变化可以通过Main Screen处理(将更新文本区显示变化后的当前温度),而Settings Screen可能会忽略此事件,因为在Settings Screen不需要显示温度。
. m) B7 C- A( @5 w( b! s5 D$ ?4 q: q" E8 f1 V, a8 g6 k: {3 J
MVP框架模式
. r$ ^2 u8 n3 ^( s6 o: }* A' u2 T5 {4 f- {4 y1 h' n
MVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Presenter负责逻辑的处理。在MVP中,View并不直接使用Model,它们之间的通信是通过Presenter 来进行的,所有的交互都发生在Presenter内部。MVP是在UI应用程序中划分职责的一种常用方法。
2 R. ]" K; E, V$ a! X% z# r: J, s) e0 ^" Y& ?5 B- @, k
下图说明了TouchGFX中的Screen概念如何与整个Model-View-Presenter框架模式联系在一起:, P" _* [/ E9 n  B3 X. H

. B4 J/ p) {# `( @, g
* c! L) @" A0 ]- o: ^- S9 B7 K- j$ x  q4 P( ~& o" W
! u+ i9 @4 L# I# P; n6 O
Model
8 b: d  [1 Y4 k9 ~- M& X- a# h( s  ?* \0 F4 a* E: \
Model类是一个单例,始终处于活动状态,并具有两个目的:) ]' Z! [8 Q1 d9 S8 ~7 i
& @! i- m  O4 i' z8 g1 \6 Y
1.存储UI的状态信息。切换Screen时,View和Presenter被释放,因此它们不能用于存储应在Screen切换期间保留的信息。因此,需要使用Model来存储UI的状态信息。# R, |! H) x* H" j- W
& ?% b2 ]/ q$ h, |1 S
2.充当与后端系统的接口,在当前活动Screen之间来回传递事件。1 \7 H5 ~9 M- m0 n

( O2 n! n# I7 o1 V- Z4 r6 EModel类有一个自动设置指向当前活动Presenter的指针。当Model中发生更改时,会将更改通知给当前活动的Presenter。这是通过应用程序的Model Listener接口中的方法实现的。+ ^$ |& E& B' k/ U8 [# \

6 m! ^) c8 Y" h* C* `5 r% t) _View
6 x/ o2 S- l3 L! K& m* b" K, v3 X+ x+ _# x- m, i
View类(或更具体地说,是从TouchGFX View类派生的用户定义类)包含在当前Screen显示的所有控件。它还包含一个setupScreen和一个tearDownScreen函数,当进入/退出当前Screen时,该函数会自动调用。通常,你可以在setupScreen函数中设置控件。+ R8 G# n- P' u3 l
. E  N: A+ B- r: E& `. F
View还包含了一个指向关联的Presenter的指针。该指针由框架自动设置。使用此指针,你可以将UI事件(如按钮单击)传递给Presenter。
& V0 Y5 a; q4 N5 p5 p% t
$ l( N( d. ?( O0 tPresenter* k) J1 K2 o6 M! {, }. n1 a

  v6 P: W7 c9 a9 E$ VPresenter类(也是从TouchGFX Presenter类派生的用户定义类)负责当前活动Screen的业务逻辑。它将接收来自Model的“后端”事件,以及来自View的UI事件,并决定采取哪种操作。例如,如果从Model接收到警报事件,则Presenter可能传递给View显示警报,弹出对话框。+ d8 Z: P" `$ t! J+ F& P
1 ~* Q% [2 u7 B& p- |1 T0 ^2 ^
Screen过渡
* k0 |" X2 Q5 `0 m. G6 W
) [8 I/ X7 w  Z' W# J使用TouchGFX,开发者可以实现从一个Screen过渡到另一个Screen的动画效果。默认的过渡效果有两种,NoTransition和SlideTransition。NoTransition可实现从一个Screen到另一个Screen的即时切换,SlideTransition可实现水平或垂直滑动切换到新Screen。你可以根据自己的需要,自定义创建过渡效果。4 Z# `1 c6 y" V# ~) \. L
8 w1 K3 N; U2 H" y6 {3 G* |
小结0 ]8 \) l' C* h7 g1 h
$ B( y# W1 M$ ~
在MVP框架中,所有数据只能保存在Model 的类对象中,Presenter是View与Model之间的纽带,View只能通过Presenter来读取数据,而不能直接读写Model中的数据。
. {  x4 R7 N+ I+ |% Y, G1 }* e$ R  [+ G. i7 ]0 `7 @% ]
事实上,Presenter将Model和View进行了分离,主要的程序逻辑在Presenter里实现。我们可以随意修改View而不影响Model。同时,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时可以保持Presenter的不变,也就是重用Presenter。此外,我们还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试,而不需要使用自动化的测试工具。% A9 Z7 @+ y0 O/ ~# w+ {: w+ k
/ p% l; K! l& A9 z9 a
在使用TouchGFX进行GUI开发时,理解MVP框架模式非常重要。那么,你掌握了今天的内容吗?欢迎留言交流。0 e8 [2 _9 N/ C- F$ @! j, W) m
( R2 ]( K& l4 ~( f6 j" t
) u8 N5 S/ y( C' A6 `! ~" ^/ U
7 a( m9 C$ o4 r4 \) G: }

+ F/ D2 e5 F( c4 s/ p参考资料:
- e7 w# Q) m1 j+ f【1】https://baike.baidu.com/item/MVP/37145503 I2 h  p3 D: N1 v* I" R
, m# D  e6 V& A; y$ T

本帖子中包含更多资源

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

x
回复

使用道具 举报

0

主题

3

帖子

34

积分

新手上路

Rank: 1

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

使用道具 举报

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

本版积分规则

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

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