1、前言
當用戶界面層數(shù)較多時,通過層層回歸的方式返回主頁不夠方便;如果在每個頁面都設置一個返回按鈕,又會增加 UI 設計復雜度。
如果使用一個物理按鍵作為 Home 鍵,無論處于任何界面,都可通過這個按鍵返回到主頁;此物理按鍵僅需要一個 GPIO。下面介紹通過 TouchGFX 實現(xiàn)此功能的原理及方法。
2、實現(xiàn)原理
TouchGFX 基本架構為 Model-View-Presenter(MVP)(參考以下章節(jié)的鏈接 ModelView-Presenter 設計模式 | TouchGFX Documentation 獲取更多信息),Model 類具有指向當前活動的 Presenter 指針。當 Model 檢測到變化時,會將變化通知當前活動Presenter,上述動作通過 ModelListener 接口中的方法來完成。
對于通過按鍵返回主頁的需求,我們可以在 Model 中檢測按鍵的變化,由于 Model 類具有指向當前活動的 Presenter 指針,因此可以將按鍵的變化通過 ModelListener 通知給當前活動 Presenter,Presenter 調用對應 View 中的屏幕切換方法,即可實現(xiàn)立即回歸主頁。由于存在多個 Presenter,因此在按鍵觸發(fā)的時刻,活動的 Presenter 可能是任何一個;所以除主頁之外,其余 Presenter 都要單獨實現(xiàn)對應 View 中切屏方法的調用。
3、實現(xiàn)方法
假設我們共有三屏內容,Screen1 為主頁,另外兩屏為 Screen2 和 Screen3。
(1) 對按鍵 IO 進行初始化設置。
(2) 在 ModelListener.hpp 中實現(xiàn)一個處理切屏的虛函數(shù)。
(3) 在 Model 中實現(xiàn)當按鍵按下時通過 modelListener 調用這個函數(shù)。
(4) 在 Screen2View.hpp 中實現(xiàn)實際處理切屏的方法。
(5) 在 Screen2Presenter.hpp 中 class Presenter 的派生類 class Screen2Presenter中聲明與 ModelListener.hpp 中虛函數(shù)同名的函數(shù)名(函數(shù)的多態(tài))。
(6) 在 Screen2Presenter.cpp 中對這個函數(shù)進行重寫,并實現(xiàn)對應 view 中實際切屏方法的調用。
(7) 對于 Screen3 或有更多的 Screen,如上述 Screen2 的(4)、(5)、(6)相關操作,這樣在按鍵按下時,無論哪個 Screen 處于有效狀態(tài),都能執(zhí)行相關的切屏操作。如果希望在某個頁面中 Home 鍵不觸發(fā)切屏操作,只需在其對應的 Presenter和 View 中不做處理即可。
另外,在 View 中實現(xiàn)切屏是調用 changeToStartScreen()實現(xiàn)的,這種方法沒有動畫效果;如果想加入動畫效果,如以 Wipe 的方式從下方切入,可以在 TouchGFX Designer 的主頁 Screen1 中添加一個不帶 Trigger 的 Interaction,將 changeToStartScreen()替換成FrontedApplicationBase.cpp 中的切屏方法 gotoScreen1ScreenWipeTransitionSouth(),即可將切屏效果帶入。
4、總結
本文闡述了如何基于 TouchGFX 的 MVP 架構,實現(xiàn)物理 Home 按鍵控制返回主頁的功能及方法。通過這一實際應用案例,可以讓用戶更深入的理解 MVP 的設計模式。