Callback 模板在 TouchGFX 中的使用
页面切换 - pendingScreenTransitionCallback
在 TouchGFX 启动过程中会初始化 MVPApplication 对象,在 MVPApplication
类中定义了一个成员 pendingScreenTransitionCallback, 它是
GenericCallback<>*类型的指针, 并初始化为 0;
TouchGFX 会调用 handlePendingScreenTransition 函数进行页面切换,最终调
用 evaluatePendingScreenTransition 函数,在此函数中会用 isValid()函数来检
查 Callback 是否已经初始化; 如果初始化了,就调用 execute 函数 (因为
Callback 为 GenericCallback<>*类型,因此 execute 函数不带参数) 。
- void evaluatePendingScreenTransition()
- {
- if (pendingScreenTransitionCallback &&
- pendingScreenTransitionCallback->isValid())
- {
- pendingScreenTransitionCallback->execute();
- pendingScreenTransitionCallback = 0;
- }
- }
具体的页面切换过程(进入第一个 screen) :
在 TouchGFX 初始化过程中, 会初始化 FrontendApplication 对象 app, 在此对
象的基类中包含一个 transitionCallback 成员, 其类型为:
touchgfx::Callback<FrontendApplicationBase> transitionCallback
在进入第一个 Screen 时, 会调用 app.gotoScreen1ScreenNoTransition(), 在此
函数中,会将 pendingScreenTransitionCallback 设置为指向 transitionCallback
的指针,最终由 TouchGFX 框架调用 execute 函数,执行 makeTransition 完成
页面的切换。
// 初始化 FrontendApplicationBase::transitionCallback, transitionCallback 的私
有成员初始化:
// pobject 赋值为 this(指向 FrontendApplicationBase)
// pmemfun_1 赋值为
&FrontendApplication::gotoScreen1ScreenNoTransitionImpl
- void FrontendApplicationBase::gotoScreen1ScreenNoTransition()
- {
- transitionCallback = touchgfx::Callback<FrontendApplicationBase>(this,
- &FrontendApplication::gotoScreen1ScreenNoTransitionImpl);
- pendingScreenTransitionCallback = &transitionCallback;
- }
//execute 函数内实际执行的函数(pobject->*pmemfun_1)(),即为如下函数:
- void FrontendApplicationBase::gotoScreen1ScreenNoTransitionImpl()
- {
- makeTransition<Screen1View, Screen1Presenter, touchgfx::NoTransition,
- Model >(¤tScreen, ¤tPresenter, frontendHeap, ¤tTransition,
- &model);
- }
|