请选择 进入手机版 | 继续访问电脑版

安富莱电子论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 3349|回复: 6
收起左侧

[客户分享] TouchGFX使用初探

[复制链接]

9

主题

84

帖子

102

积分

初级会员

积分
102
发表于 2016-5-3 22:53:36 | 显示全部楼层 |阅读模式
在学习touchgfx之前先了解MVP模式:
图1.png

MVP模式实现数据,主导器控制数据逻辑,视图三者分离,体现在touchgfxUML图如下:
图2.png



程序该部分实现如下:
图3.png 图4.png

图5.png 图6.png

一个程序只有一个model,可以有多对presenterview

下面再看touchgfx主要基类Drawable
图7.png

touchgfx中控件都直接或间接派生于Drawable类,Drawable类实际也实现了对控件的管理作用。可以发现touchgfx的控件管理结构和早期的ucgui结构很类似。下面是ucgui的结构,可以帮助理解。parent相当于hparentnextslibling相当于hNextLinnextRrawChainElement相当于hNextfirstchild相当于hfirstchild
图8.png 图9.png 图10.png

Touchgfxcontainer或继承于container的控件与ucguiwindow类似。
当得到触摸屏触点坐标后,可以遍历此链表,得到最上层和触点坐标符合的控件,通常是先进行初步信息处理,然后回调绑定的回调函数。

现在以button的为例说明:
Model部分:

Model是数据部分,为给presenter提供数据操作,所以必须提供set_get_接口。然后考虑到数据异常或如tickevent等问题,有必要提供接口通知presenter,具体做法是在类ModelListener中提供接口,然后在model及用户的present(用户present继承于presentModelListener)中实现,通过多态可实现一个model中调用同一名称函数实现多种功能。
图11.png 图12.png

User_Presenter部分:

Presenter是数据处理和程序逻辑控制部分,在这部分里要实现比如通知view显示数据,把与用户交互得到数据写到model部分等功能。 图13.png 图14.png
mainpresenter中声明了两个button的行为函数,在实现中调用view方法和model方式进行输出和储存处理。

User_view部分:
该部分主要是调用控件属性函数控制控件的行为,通知与之相对的present部分。从以下声明中可看出具体用到的控件在view部分中声明。既然有控件也要给控件绑定用户想要实现的功能,所以有回调函数模版类的存在。setupScreen函数在Screen中声明为虚函数,供子类实例化,和present中的active函数一起被调用,下面会见到。
图15.png 图16.png

以上setupScreenadd函数在对诸如container类或其继承类中应为<Widget>.add(widget),container containcontain.add(upbutton);


最后一部分就是FrontendApplication了,它负责screen的转换,也即实现model的重新绑定。
voidFrontendApplication::gotoMainScreen()
{
    transitionCallback = Callback<FrontendApplication >(this, &FrontendApplication::gotoMainScreenImpl); ;
    pendingScreenTransitionCallback =&transitionCallback;
}

voidFrontendApplication::gotoMainScreenImpl()
{
    makeTransition< MainView, MainPresenter,NoTransition, Model >(&currentScreen, &currentPresenter,frontendHeap, &currentTransition, &model);
}

Callback<FrontendApplication>transitionCallback;
GenericCallback<>*pendingScreenTransitionCallback; ///< Callback for screen transitions. Willbe set to something valid when a transition request is made.
pendingScreenTransitionCallback注释可以看出这是将要调用的view回调函数。
gotoMainScreenImpl函数是presentview绑定的具体实现。
voidFrontendApplication::___Screen()
voidFrontendApplication::___ScreenImpl()
这样函数成对出现,也是C++惯用手法。
现在看voidFrontendApplication::gotoMainScreenImpl()makeTransition函数模版,template<class ScreenType, class PresenterType, class TransType, class ModelType  >
PresenterType*makeTransition(Screen** currentScreen, Presenter** currentPresenter,MVPHeap& heap, Transition** currentTrans, ModelType* model)
{
*currentTrans = newTransition;
    *currentPresenter = newPresenter;
    *currentScreen = newScreen;
    model->bind(newPresenter); //绑定新的present
    newPresenter->bind(model);//bind
    newScreen->bind(*newPresenter);//bind
    finalizeTransition((Screen*) newScreen,(Presenter*) newPresenter, (Transition*) newTransition);
}
它实现现有screen的切出和将要切换screen的切入。
其中调用函数
finalizeTransition((Screen*)newScreen, (Presenter*) newPresenter, (Transition*) newTransition);
static inlinevoid finalizeTransition(Screen* newScreen, Presenter* newPresenter, Transition*newTransition){
    newScreen->setupScreen();
    newPresenter->activate();
   newScreen->bindTransition(*newTransition);
    newTransition->init();
    Application::getInstance()->draw();
}
还有就是screen的初始入口了,它位于FrontendHeap.hpp
图17.png

最后来看看touchgfx在应用中何处被实例化
图18.png

剩下的就是消息循环了,这个在没源码情况下很难分析,猜测和Qt消息循环差不多,找到控件,派发一系列消息到控件,调用控件绑定的回调函数诸如此类。

回复

使用道具 举报

5391

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43672
QQ
发表于 2016-5-4 00:33:02 | 显示全部楼层
非常感谢楼主分享经验,置酷。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

9

主题

84

帖子

102

积分

初级会员

积分
102
 楼主| 发表于 2016-5-4 00:47:24 | 显示全部楼层

回 eric2013 的帖子

eric2013:非常感谢楼主分享经验,置酷。 (2016-05-04 00:33) 
也是才刚尝试使用
回复

使用道具 举报

5391

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43672
QQ
发表于 2016-5-4 00:53:04 | 显示全部楼层

回 有梦为马 的帖子

有梦为马:也是才刚尝试使用 (2016-05-04 00:47)
回头有精力的话,你可以测试下官方发布的评估板是不是显示界面上面有水印,以前官方的介绍时是这么说的。
[s:142]
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

9

主题

84

帖子

102

积分

初级会员

积分
102
 楼主| 发表于 2016-5-4 13:27:09 | 显示全部楼层

回 eric2013 的帖子

eric2013:回头有精力的话,你可以测试下官方发布的评估板是不是显示界面上面有水印,以前官方的介绍时是这么说的。
[s:142]

 (2016-05-04 00:53) 
嗯嗯,肯定会测试下。[s:142]
身边人有人用f7跑,网上也有不少视频,好像没发现有水印的情况。
回复

使用道具 举报

45

主题

572

帖子

662

积分

金牌会员

积分
662
发表于 2019-3-6 23:11:20 | 显示全部楼层
相同情况 不知道和emwin比起来占用资源,cpu的比较是如何。。。
回复

使用道具 举报

16

主题

261

帖子

293

积分

高级会员

积分
293
发表于 2019-3-7 09:33:35 | 显示全部楼层
roguebear 发表于 2019-3-6 23:11
相同情况 不知道和emwin比起来占用资源,cpu的比较是如何。。。

我没用过TouchGFX,但感觉你说的这些方面,TouchGFX比emWin会更优胜一些。emWin像一个粗糙的仿制品,站在风口上的猪,一不留神就飞起来了。TouchGFX是采用新理念精心规划而成,各方面应该会好不少。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|安富莱电子论坛 ( 鄂ICP备09023347号,公安机关备案号42010602000201 )

GMT+8, 2019-3-19 23:12 , Processed in 0.195824 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表