1、前言
当用户界面层数较多时,通过层层回归的方式返回主页不够方便;如果在每个页面都设置一个返回按钮,又会增加 UI 设计复杂度。
如果使用一个物理按键作为 Home 键,无论处于任何界面,都可通过这个按键返回到主页;此物理按键仅需要一个 GPIO。下面介绍通过 TouchGFX 实现此功能的原理及方法。
2、实现原理
TouchGFX 基本架构为 Model-View-Presenter(MVP)(参考以下章节的链接 ModelView-Presenter 设计模式 | TouchGFX Documentation 获取更多信息),Model 类具有指向当前活动的 Presenter 指针。当 Model 检测到变化时,会将变化通知当前活动Presenter,上述动作通过 ModelListener 接口中的方法来完成。
对于通过按键返回主页的需求,我们可以在 Model 中检测按键的变化,由于 Model 类具有指向当前活动的 Presenter 指针,因此可以将按键的变化通过 ModelListener 通知给当前活动 Presenter,Presenter 调用对应 View 中的屏幕切换方法,即可实现立即回归主页。由于存在多个 Presenter,因此在按键触发的时刻,活动的 Presenter 可能是任何一个;所以除主页之外,其余 Presenter 都要单独实现对应 View 中切屏方法的调用。
3、实现方法
假设我们共有三屏内容,Screen1 为主页,另外两屏为 Screen2 和 Screen3。
(1) 对按键 IO 进行初始化设置。
(2) 在 ModelListener.hpp 中实现一个处理切屏的虚函数。
(3) 在 Model 中实现当按键按下时通过 modelListener 调用这个函数。
(4) 在 Screen2View.hpp 中实现实际处理切屏的方法。
(5) 在 Screen2Presenter.hpp 中 class Presenter 的派生类 class Screen2Presenter中声明与 ModelListener.hpp 中虚函数同名的函数名(函数的多态)。
(6) 在 Screen2Presenter.cpp 中对这个函数进行重写,并实现对应 view 中实际切屏方法的调用。
(7) 对于 Screen3 或有更多的 Screen,如上述 Screen2 的(4)、(5)、(6)相关操作,这样在按键按下时,无论哪个 Screen 处于有效状态,都能执行相关的切屏操作。如果希望在某个页面中 Home 键不触发切屏操作,只需在其对应的 Presenter和 View 中不做处理即可。
另外,在 View 中实现切屏是调用 changeToStartScreen()实现的,这种方法没有动画效果;如果想加入动画效果,如以 Wipe 的方式从下方切入,可以在 TouchGFX Designer 的主页 Screen1 中添加一个不带 Trigger 的 Interaction,将 changeToStartScreen()替换成FrontedApplicationBase.cpp 中的切屏方法 gotoScreen1ScreenWipeTransitionSouth(),即可将切屏效果带入。
4、总结
本文阐述了如何基于 TouchGFX 的 MVP 架构,实现物理 Home 按键控制返回主页的功能及方法。通过这一实际应用案例,可以让用户更深入的理解 MVP 的设计模式。
1036