查看: 3471|回复: 1

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

[复制链接]

658

主题

659

帖子

2079

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2079
发表于 2019-11-22 09:54:59 | 显示全部楼层 |阅读模式
Screen 概念  Q/ ?( g' C) o6 B1 C7 H
9 ]) v8 d+ G, L9 Y5 Z# k7 z
在TouchGFX应用程序中,开发者可以根据项目需要创建任意数量的Screen。这里的Screen是指UI元素(控件)及其相关的业务逻辑。一个Screen通常包括两个内容:一个View,涵盖该Screen上显示的所有控件;一个Presenter,涵盖该Screen上所有的业务逻辑。
' t" n8 a4 _5 }/ J- g6 w0 G3 V- a7 ]
你可以选择只创建一个Screen来实现整个应用程序(这意味着此应用程序只有一个View和一个Prsenter),但是对于复杂一点的程序,我们不建议这样做。出于以下两个原因,我们建议将与UI的无关部分分成不同的Screen来实现:
& ^" x+ Y7 m( S
. t! Y# U) C  ?' j+ `7 A+ C1. TouchGFX有自己的内存分配方案,它自动分配最消耗RAM的Screen所需的RAM且只分配这个内存,分配的RAM可以在应用程序的所有Screen上重用。4 h2 d/ M. t+ l, T' d

7 W5 }4 W7 Z* Q+ N+ y, l, Y2. 拥有多个Screen,UI代码更加易于维护。" k+ N9 g& A# }' i6 `( W
5 B, T, i( Z, v0 P% C9 ^
定义Screen
0 p4 O' |2 C6 Y' }
9 \  H* `, m8 _  @4 y* y- R关于如何将一个应用程序划分成多个Screen,并没有确切的规则,但是有一些办法可以帮助你确定应由哪些Screen组成特定的应用程序。
7 E4 N, ]+ Y2 d+ d# r& F' s% C3 b6 A0 [$ ]2 v  f- b0 K( ?
在外观上和功能上不相关的UI应放置在不同的Screen中。举个简单的调温器例子。这个调温器应用程序只有一个温度显示界面和一个设置界面,首先我们为温度显示界面创建一个Main Screen,然后为设置界面创建一个Settings Screen。Main Screen的视图将包含一个背景图像的控件、一个显示温度的文本区域以及一个用于切换到设置界面的按钮。另一方面,Settings Screen视图可能包含用于显示设置选项列表和不同背景图像的控件。如果设置界面需要编辑许多不同类型的选项(日期,名称,温度,单位等),那个这个Screen的复杂度将变大。在这种情况下,可以考虑将设置界面进一步分成多个子Screen,此时Settings Screen相当于整个设置菜单选项的树干,而它的子Screen可以用于编辑特定值。  U+ i- V  V2 t2 ~- b
* L1 s0 `" U( r8 @( [! X, T( R
由于TouchGFX是用C++编写的,因此你可以选择在Screen中利用面向对象的范例。比如,如果你的所有Screen都需要在顶部状态栏显示当前时间、电池电量等信息,则可以创建仅包含状态栏的基本View,并使所有View都源自该类,自动添加状态栏功能。! u& A7 U0 N+ E: c( U! x$ e3 i
) G! k) e, X+ H' T/ C' T2 c1 S. i
当前活动的Screen3 D' z) H4 @2 f6 d9 R1 Y) H# W

: |& m! K/ Y! F0 i) K由于TouchGFX为Screen分配内存的方式(仅分配给最大的View和最大的Presenter),一次只能激活一个View和一个Presenter。因此,如果调温器应用程序正在展示温度显示界面,那么设置界面的Screen并不会运行。
* ~5 R& n9 c4 [/ q2 I; z7 f, R/ u, f! f1 c8 k4 Z6 I9 n
如果事件是从“后端”(执行调温器实际工作的所有非UI代码)或硬件外围设备接收的,那么可以将这些事件委托给当前活动的屏幕。这就是关注点分离,因为某些事件仅对应用程序中的某些Screen有意义。例如,收到事件通知当前温度的变化可以通过Main Screen处理(将更新文本区显示变化后的当前温度),而Settings Screen可能会忽略此事件,因为在Settings Screen不需要显示温度。
3 ^9 r1 j; I+ a" o0 G2 C( |! h, f" d& v- N
MVP框架模式
# c7 g; w4 A- P+ m1 C' K
3 A1 [% X% Z* h9 n1 f' mMVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Presenter负责逻辑的处理。在MVP中,View并不直接使用Model,它们之间的通信是通过Presenter 来进行的,所有的交互都发生在Presenter内部。MVP是在UI应用程序中划分职责的一种常用方法。
' h7 x  S# @8 w! t; N; M1 Q. K& \4 q: h; e% g& ~
下图说明了TouchGFX中的Screen概念如何与整个Model-View-Presenter框架模式联系在一起:
5 o4 w+ }+ E2 O$ `0 A
' e, C  |0 E" r8 N2 Y: u& Y* D: P0 c# P; A* a# P9 v

( p" `2 v6 V# V% r6 Z' ]2 J- A( K; d. A: L' C
Model2 C, w0 Y8 G5 `9 {2 [' J- b) A
, X0 u2 P1 k$ s+ N6 V' p
Model类是一个单例,始终处于活动状态,并具有两个目的:; t7 u9 j  O" l0 p' B1 F6 n: E0 W

3 E5 o3 a6 e; M/ _1 P# c( b3 s1.存储UI的状态信息。切换Screen时,View和Presenter被释放,因此它们不能用于存储应在Screen切换期间保留的信息。因此,需要使用Model来存储UI的状态信息。
- X% b) U2 T! B1 g1 a% |
5 q8 y# ?/ W: |% f2.充当与后端系统的接口,在当前活动Screen之间来回传递事件。  l, O9 r% \5 k5 y$ u5 s8 Y# p

8 o- C! G: w5 mModel类有一个自动设置指向当前活动Presenter的指针。当Model中发生更改时,会将更改通知给当前活动的Presenter。这是通过应用程序的Model Listener接口中的方法实现的。
( V8 @+ ]9 {  K# C, E2 i# h5 X  K0 n' u0 ^( ?/ S$ n3 [
View
& O7 p3 i' z6 M% o' T* M; J- S! P, \( _2 L
View类(或更具体地说,是从TouchGFX View类派生的用户定义类)包含在当前Screen显示的所有控件。它还包含一个setupScreen和一个tearDownScreen函数,当进入/退出当前Screen时,该函数会自动调用。通常,你可以在setupScreen函数中设置控件。
- N2 _2 B( @& ~+ V
0 A: X+ z9 G: ~& J8 bView还包含了一个指向关联的Presenter的指针。该指针由框架自动设置。使用此指针,你可以将UI事件(如按钮单击)传递给Presenter。
! y; W7 p4 ~7 ]2 i- A# c
: q) H$ l; S4 I: kPresenter' \# K" ]4 D$ z  c9 }2 w! M& O! }* L

: z2 N) h; `' y/ J$ S1 xPresenter类(也是从TouchGFX Presenter类派生的用户定义类)负责当前活动Screen的业务逻辑。它将接收来自Model的“后端”事件,以及来自View的UI事件,并决定采取哪种操作。例如,如果从Model接收到警报事件,则Presenter可能传递给View显示警报,弹出对话框。+ D. P4 M3 ^" k0 s! O  z8 u7 e
% C- A3 _% [) X3 Z
Screen过渡
& g" |4 a8 i( r# `" u9 r5 S: w5 u1 m9 f0 N$ f* o; j  J7 I
使用TouchGFX,开发者可以实现从一个Screen过渡到另一个Screen的动画效果。默认的过渡效果有两种,NoTransition和SlideTransition。NoTransition可实现从一个Screen到另一个Screen的即时切换,SlideTransition可实现水平或垂直滑动切换到新Screen。你可以根据自己的需要,自定义创建过渡效果。
  y0 R8 Y$ t- L7 |5 U% [* n: Y5 I- b3 ^1 g! _2 k
小结
: M+ t1 _4 r$ Y. W0 M- l% f& r; p% [; }
在MVP框架中,所有数据只能保存在Model 的类对象中,Presenter是View与Model之间的纽带,View只能通过Presenter来读取数据,而不能直接读写Model中的数据。
; y- W6 d. i" u1 B( p  x  c) z9 A
) x2 \7 u4 N" B  n0 Q$ n- O事实上,Presenter将Model和View进行了分离,主要的程序逻辑在Presenter里实现。我们可以随意修改View而不影响Model。同时,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时可以保持Presenter的不变,也就是重用Presenter。此外,我们还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试,而不需要使用自动化的测试工具。
1 m! w3 a$ h" ~9 Z: J' k" K9 ~* F* w
在使用TouchGFX进行GUI开发时,理解MVP框架模式非常重要。那么,你掌握了今天的内容吗?欢迎留言交流。
- a4 ^8 i+ w- \. n5 r$ T4 d0 i; v: s8 m7 A
. i( n3 ^4 P- P0 {  w

. n; l0 E1 }8 V+ p% C4 O
! m! o$ s" i4 z$ s- H' t参考资料:" N; c0 M' |6 Q& Z9 V0 E
【1】https://baike.baidu.com/item/MVP/3714550
- U$ }, {( D/ I, u3 C
& c8 K/ k: w, L; d0 x6 b% y- y

本帖子中包含更多资源

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

x
回复

使用道具 举报

0

主题

3

帖子

34

积分

新手上路

Rank: 1

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

使用道具 举报

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

本版积分规则

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

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