关键词:gui,touchgfx,transition
目录预览
1、引言
2、touchgfx屏幕切换功能
3、小结
01
引言
touchgfx 是专用于 stm32 的图形界面设计软件,可基于低成本开发优秀的图形界面,而且它已变的越来越流行。为了帮助客户更加深入地理解和使用 touchgfx ,本文针对touchgfx 屏幕切换的实现方式进行了介绍。通过简析基本例程“transition example”的源码,剖析其中切屏实现的流程;并简介了如何使用 touchgfx designer 快捷地修改屏幕切换模式,希望能帮助客户更好地使用 touchgfx 切屏特色与功能。
02
touchgfx屏幕切换功能
2.1. touchgfx transition 类介绍
touchgfx 框架中关于屏幕切换功能,实现了一个 transition 基类和五个派生类,其关系如下图图 1 所示。其中,transition 是切屏的抽象基类,定义了屏幕切换期间发生的基本事务。虚函数主要包括:init(初始化)、teardown(销毁,切屏完成需要的清理过程)、handletickevent(tick 事件处理函数,主要用于完成切屏的动画效果)、invalidate(失效,用于重绘)等。五个派生类,其中 notransition 是最基本的派生类,它没有任何视觉效果,当前屏幕会直接被新屏内容替换。另外四个派生类则具有动画效果:blocktransition、covertransition、slidetransition 和 wipetransition。
图1.touchgfx transition 类继承关系
blocktransition 将屏幕分成 8x6 份块,在屏幕切换时会每次随机重绘其中的 2 个块,比较节省 mcu 资源,适合性能不高的 mcu;covertransition 的动画效果是“新屏画面从一个方向移动过来,直至完全覆盖原屏幕内容”;slidetransition 的动画效果是“新屏与原屏拼接在一起,(原屏在前,新屏在后)从指定的方向滑过来”;wipetransition 的动画效果是“新屏内容从一个方向展开(有一种擦除原屏,露出新屏的效果)”。blocktransition、covertransition、slidetransition 和 wipetransition 均在 handletickevent 函数中实现各自风格的动画效果,teardown 函数中则销毁切屏过程中创建的用于动画的临时快照控件等。下面我们首先生成transition 例程,并对例程源码相关部分做进一步的分析。
2.2. touchgfx transition 例程
运行 touchgfx designer,选择 examples;通过 select board setup 选择 stm32h735g dk 板(也可以是 touchgfx 适用的其它板件);从众多例程中选择“transition example”例程;将 application name 改为 transition_example,如下图图 2 所示,然后点击 create 创建工程。
图2.touchgfx designer 生成 transition example 例程
进入 touchgfx designer 主界面后,会看到画布上有四个方向按钮和一个背景图片,如下 图图 3 所示。我们对界面不做更改,直接选择 designer 右下角 (run target)在目标板上运行。该操作将会复制 touchgfx 框架文件,生成配置文件、makefile、代码及资源文件(images、fonts、texts),然后编译链接、烧录目标板并运行。程序运行起来后,您可以熟悉一下该例程应用,该应用有 5 个屏幕画面,一个主屏及上下左右 4 个屏幕。点击方向按钮会进行相关方向的切屏。例程中切屏方式是 slidetransition 模式。下面我们解读一下相关代码,再对transition 模式进行修改。
图3.touchgfx designer transition example 设计界面
2.3. 例程代码解读与切屏模式修改
2.3.1. 关键代码流程
切屏操作是由点击按钮触发的,我们以右向按钮 为例,一步步查看调用过程。首先我们可以确定当前屏幕是 mainview 类,mainview 继承自 mainviewbase,该 mainviewbase 由designer 自动生成。它已经包含了四个按钮、一个背景框和一个背景图片。按钮点击的处理函数为 buttoncallbackhandler。详细代码如下:
我们再来看该按钮处理函数,这里右向按钮调用了 application 对象的gotorightscreenslidetransitioneast 函数:
在 frontendapplicationbase 中,gotorightscreenslidetransitioneast 接口通过transitioncallback 跳转到 gotorightscreenslidetransitioneastimpl 函数。具体过程,首先application 事务处理过程中会调用 handlependingscreentransition,再转至函数evaluatependingscreentransition,经 transitioncallback 完成对函数gotorightscreenslidetransitioneastimpl 的调用(更多的关于 callback 的介绍请参阅相关文档或 lat)。如下图图 4 所示:
图4.transition callback 的应用过程
具体代码如下:
函数 gotorightscreenslidetransitioneastimpl 中调用了屏幕切换的关键模板函数maketransition。
2.3.2. 模板函数 maketransition
下面我们来看一看实现屏幕切换功能的关键模板函数 maketransition。该函数在mvpapplication.hpp 中,源码如下:
我们知道 touchgfx 应用架构是 mvp 架构(这里不做过多介绍,需要了解的客户请参考相关文档),这里的 maketransition 函数将 touchgfx 应用中的 view&presenter 和 model 绑定,并与 transition 联系在一起,进而实现切屏功能。具体来说,首先 preparetransition 函数对当前的 view/presenter/transition 进行销毁;然后以模板参数 touchgfx::slidetransition(用户指定的方向)创建 transition 派生类对象;以模板参数 screentype 类进行新 view 的创建(这里是 righview);再以模板参数 presentertype 类创建新的 presenter(这里是rightpresenter)。将 presenter 与 model 绑定并将 view 与 presenter 绑定(以保证可以正常调用各自接口,实现 mvp 架构功能);最后调用 finalizetransition 函数,在 finalizetransition 中进行新 view 的 setupscreen,绑定新 transition, 并激活新 transition。
2.3.3. transition 动画效果的实现
具体的 transition 动画效果是在 transition 派生类的 handletickevent 中实现的。我们例程中是 slidetransition,其 handletickevent 中实现了滑动的效果。将原有屏幕的快照,在滑动方向的来向上与新 view 的快照连接,一起沿滑动方向移动,实现动画效果。具体请见下面handletickevent 函数源码:
2.3.4. transition 风格的修改
模板配合 c++编程给予了 touchgfx 框架极大的简洁性和适配的便利性,对于切屏风格的增加或修改也是非常的简便。客户甚至不需要理解前面介绍的 transition 具体原理,也能够非常方便地修改切屏模式。使用 touchgfx designer,仅需点击几下鼠标即可实现。如下图图 5 所示,这里我们在关联右向按钮的 interaction 中,将 transition 模式改为了 wipe 模式,编译运行即可查看效果。
图5.touchgfx designer transition 模式的修改
03
小结
touchgfx 是针对 stm32 产品的专用优秀界面设计工具,功能强大易用。本文对屏幕切换功能进行了简介,从基本示例“transition example”出发,对切屏部分的源代码进行了浅析,并介绍了如何使用 touchgfx designer 实现切屏模式的修改。希望本文能够帮助客户更深入地理解 stm32 touchgfx。
完整内容请点击“阅读原文”下载原文档。
原文标题:实战经验 | stm32gui touchgfx 屏幕切换功能简介
文章出处:【微信公众号:stm32单片机】欢迎添加关注!文章转载请注明出处。
2020年预计将有多达1000万辆自动驾驶汽车上路
芯片制造过程高清流程
乡村新能源汽车充电桩物联网监控运维系统解决方案
机器人是威胁还是人类一次新的大发展
初学单片机经常会有那些不容易掌握的知识点
实战经验 | STM32GUI TouchGFX 屏幕切换功能简介
智能照明控制系统在学校中的应用案例介绍
韩国为何可能成为亚洲的区块链中心地带
2020 年全球重大科学突破:科学力量如何改变全球后疫情时代
5G商业快速发展,toC跨代体验提升和toB产业生态协同是关键
汽车空调制冷系统的构成与工作原理
压阻式压力传感器的仿真设计分析
新一轮显示革命正在到来,OLED正在取代LCD
USB Type-C手机领夹式无线麦克风快充方案
什么是过电压和欠电压?
机器学习在网络中的实际应用
基于LM317K的实用型LED照明电路
向量数据库:AI时代的下一个热点
爱立信股价暴跌21% 市值蒸发38亿美元
谷歌因软件Bug决定提前4个月关闭Google+媒体服务和API