查看: 3853|回复: 1

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

[复制链接]

658

主题

659

帖子

2079

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2079
发表于 2019-11-22 09:54:59 | 显示全部楼层 |阅读模式
Screen 概念/ h5 d$ [/ Q% h1 f9 d# u$ u  Y

' j" H( @6 B$ |  l) w在TouchGFX应用程序中,开发者可以根据项目需要创建任意数量的Screen。这里的Screen是指UI元素(控件)及其相关的业务逻辑。一个Screen通常包括两个内容:一个View,涵盖该Screen上显示的所有控件;一个Presenter,涵盖该Screen上所有的业务逻辑。
9 ?' C2 Q; _/ N* G; A/ l8 z" l  N. g" @' R, m+ E
你可以选择只创建一个Screen来实现整个应用程序(这意味着此应用程序只有一个View和一个Prsenter),但是对于复杂一点的程序,我们不建议这样做。出于以下两个原因,我们建议将与UI的无关部分分成不同的Screen来实现:1 W4 e9 M& o5 N
: A! z, P3 G, ?) _( B" A
1. TouchGFX有自己的内存分配方案,它自动分配最消耗RAM的Screen所需的RAM且只分配这个内存,分配的RAM可以在应用程序的所有Screen上重用。
: o0 }1 x) ^& R9 A! e% H) I% m+ A/ i
2. 拥有多个Screen,UI代码更加易于维护。
9 r/ B8 I& _/ v7 H' h& f; l; ~) t
! B) @+ p% O* }; E. r( {, u0 Q定义Screen7 E- [5 j0 ~% e0 g" N$ a2 y7 r$ \
7 r9 l2 S. |  m$ B
关于如何将一个应用程序划分成多个Screen,并没有确切的规则,但是有一些办法可以帮助你确定应由哪些Screen组成特定的应用程序。
2 X% j: R5 W  B- A" V1 l4 v2 y: g- x, y6 a3 k' p( i
在外观上和功能上不相关的UI应放置在不同的Screen中。举个简单的调温器例子。这个调温器应用程序只有一个温度显示界面和一个设置界面,首先我们为温度显示界面创建一个Main Screen,然后为设置界面创建一个Settings Screen。Main Screen的视图将包含一个背景图像的控件、一个显示温度的文本区域以及一个用于切换到设置界面的按钮。另一方面,Settings Screen视图可能包含用于显示设置选项列表和不同背景图像的控件。如果设置界面需要编辑许多不同类型的选项(日期,名称,温度,单位等),那个这个Screen的复杂度将变大。在这种情况下,可以考虑将设置界面进一步分成多个子Screen,此时Settings Screen相当于整个设置菜单选项的树干,而它的子Screen可以用于编辑特定值。5 x3 U, S+ T3 M: ^
* }, ^1 g5 Q, w: b" ~+ r2 |
由于TouchGFX是用C++编写的,因此你可以选择在Screen中利用面向对象的范例。比如,如果你的所有Screen都需要在顶部状态栏显示当前时间、电池电量等信息,则可以创建仅包含状态栏的基本View,并使所有View都源自该类,自动添加状态栏功能。* x) p# Y4 O0 l( Q
! y; D$ Q0 \  f; y# C  }8 Z  H
当前活动的Screen
7 {0 t8 e& t! T  u- v* ^
/ [5 p- s; ~% [由于TouchGFX为Screen分配内存的方式(仅分配给最大的View和最大的Presenter),一次只能激活一个View和一个Presenter。因此,如果调温器应用程序正在展示温度显示界面,那么设置界面的Screen并不会运行。: f( `, ?- C* ^( n; C* q) \
; N+ n- R& n, Y# Q
如果事件是从“后端”(执行调温器实际工作的所有非UI代码)或硬件外围设备接收的,那么可以将这些事件委托给当前活动的屏幕。这就是关注点分离,因为某些事件仅对应用程序中的某些Screen有意义。例如,收到事件通知当前温度的变化可以通过Main Screen处理(将更新文本区显示变化后的当前温度),而Settings Screen可能会忽略此事件,因为在Settings Screen不需要显示温度。
2 z% \6 g) P: \4 h" V+ s+ L) l$ F; m2 ^4 Q1 c5 A1 v
MVP框架模式
( e2 n5 A' h% N4 V  z3 \% ~) R( W1 H" A* v" ?
MVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Presenter负责逻辑的处理。在MVP中,View并不直接使用Model,它们之间的通信是通过Presenter 来进行的,所有的交互都发生在Presenter内部。MVP是在UI应用程序中划分职责的一种常用方法。
: W1 o, d5 ~' }( J9 d: ]
8 s* S1 H% c% s, i% R下图说明了TouchGFX中的Screen概念如何与整个Model-View-Presenter框架模式联系在一起:
/ B4 U( V) ]7 r; O8 G' ?$ D0 F  H7 ?% |% P/ ?

! a6 J& J( A: }3 _. c$ y% c, w3 c( b6 M& |

: c+ C% b- e/ Y4 p! UModel
/ ~9 t" W& y, w! r9 I! y" L# [% y" l
Model类是一个单例,始终处于活动状态,并具有两个目的:
$ t; [% c8 Y& A/ _5 A4 L8 O2 j) _) y# s6 ]3 K: l
1.存储UI的状态信息。切换Screen时,View和Presenter被释放,因此它们不能用于存储应在Screen切换期间保留的信息。因此,需要使用Model来存储UI的状态信息。
8 n  `) }7 b1 b. V/ B+ x. K2 R: a
% r6 s1 u& `: w6 z( e2.充当与后端系统的接口,在当前活动Screen之间来回传递事件。
) M7 o3 F) M2 j
+ w- c# R; ?! VModel类有一个自动设置指向当前活动Presenter的指针。当Model中发生更改时,会将更改通知给当前活动的Presenter。这是通过应用程序的Model Listener接口中的方法实现的。5 d6 n$ a2 j4 s; A' l' @. c6 @" e) `

0 ]# Z7 F; N/ N# A; t* C: JView
! t( ?; }) p( l- V; B- g2 y4 T7 Y0 g3 ~
View类(或更具体地说,是从TouchGFX View类派生的用户定义类)包含在当前Screen显示的所有控件。它还包含一个setupScreen和一个tearDownScreen函数,当进入/退出当前Screen时,该函数会自动调用。通常,你可以在setupScreen函数中设置控件。7 Q5 j7 F: R3 _- Z7 F

7 W' p  b. E# o! l1 X. cView还包含了一个指向关联的Presenter的指针。该指针由框架自动设置。使用此指针,你可以将UI事件(如按钮单击)传递给Presenter。
% j3 O2 O% B) y/ U* a" \! [, M- s# {% x- _
Presenter
' A6 y2 g# S9 `6 L+ K- c, }1 C+ R# X- ?* u; i
Presenter类(也是从TouchGFX Presenter类派生的用户定义类)负责当前活动Screen的业务逻辑。它将接收来自Model的“后端”事件,以及来自View的UI事件,并决定采取哪种操作。例如,如果从Model接收到警报事件,则Presenter可能传递给View显示警报,弹出对话框。8 V) a+ p1 b7 v* g
* \0 n7 z1 t$ [4 i- I% i. Q
Screen过渡
# |" A7 h1 q1 j: Z) I5 [9 B* D7 X0 `# K/ q
使用TouchGFX,开发者可以实现从一个Screen过渡到另一个Screen的动画效果。默认的过渡效果有两种,NoTransition和SlideTransition。NoTransition可实现从一个Screen到另一个Screen的即时切换,SlideTransition可实现水平或垂直滑动切换到新Screen。你可以根据自己的需要,自定义创建过渡效果。/ \7 I5 D) D1 _) c& ?/ R

' ~% t5 {3 @8 S$ e9 t4 f小结' s- s5 H9 v- V: M' P0 k

& s! I% L6 h) P: v. Q在MVP框架中,所有数据只能保存在Model 的类对象中,Presenter是View与Model之间的纽带,View只能通过Presenter来读取数据,而不能直接读写Model中的数据。2 ~! K9 \% I7 r2 A; N* p
$ }% x, f; Q" ~5 O# j* I0 z8 K
事实上,Presenter将Model和View进行了分离,主要的程序逻辑在Presenter里实现。我们可以随意修改View而不影响Model。同时,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时可以保持Presenter的不变,也就是重用Presenter。此外,我们还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试,而不需要使用自动化的测试工具。6 U9 u1 E# v: D/ h; P- e& n

6 z3 Q; B# m& X, f* V% P# h在使用TouchGFX进行GUI开发时,理解MVP框架模式非常重要。那么,你掌握了今天的内容吗?欢迎留言交流。
2 B; E/ G) O) [& `. h
# Q% B) @( K9 F' O
' v: W& @$ P& d; Y) k
! M  d) p7 ^8 t7 }2 I: d
- u* |( {! E8 q1 x4 a& h参考资料:; u  s! N9 G7 [" K; E2 E7 ^
【1】https://baike.baidu.com/item/MVP/3714550
6 E0 F! E8 [1 s3 N- C$ V; ]) |$ Q1 ~4 s8 t8 s

本帖子中包含更多资源

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

x
回复

使用道具 举报

0

主题

3

帖子

34

积分

新手上路

Rank: 1

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

使用道具 举报

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

本版积分规则

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

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