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);
}
|