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