TouchGFX 作为 STM32 平台专属的图形界面开发工具,凭借高效的硬件加速、丰富的控件库和可视化设计流程,成为嵌入式 GUI 开发的首选方案。在实际项目中,原生控件往往无法满足复杂的交互需求,而 TouchGFX 提供的Mixin 模板功能,无需自定义控件,就能快速为标准控件扩展额外能力。
本文基于 ST 官方 LAT1206 应用笔记,以最常用的ClickListener功能为例,结合官方 Button Example 例程,手把手教你为文本框等普通控件添加点击交互,同时深入解析 Mixin 的底层实现逻辑,帮你真正掌握 TouchGFX 控件扩展的核心方法。
资料获取:【应用笔记】LAT1206 TouchGFX 控件附加Mixin功能的方法介绍
1. TouchGFX Mixin 功能基础认知
1.1 什么是 Mixin
Mixin 本质是C++ 类模板,是 TouchGFX 为控件扩展功能设计的轻量方案,核心优势是无需修改控件源码、无需继承重写,直接通过模板为现有控件附加新能力,代码复用性强、移植性好。
1.2 官方提供的 4 种 Mixin 功能
TouchGFX 4.20.0 版本内置 4 种标准 Mixin,覆盖主流交互需求:
- Draggable:为控件添加拖拽功能;
- ClickListener:为控件添加点击事件响应(本文重点);
- FadeAnimator:为控件添加淡入淡出动画;
- MoveAnimator:为控件添加位移动画。
其中ClickListener是最常用的 Mixin,可让原本不支持点击的控件(如文本框、图像)实现点击交互,完美解决原生控件交互能力不足的问题。
2. 实战:为文本框附加 ClickListener 点击功能
本次实战基于 STM32H735G-DK 开发板的Button Example官方例程,实现效果:点击计数文本框,数值直接 + 2。
步骤 1:生成官方例程工程
- 打开 TouchGFX Designer,在 Examples 列表中选择Button Example;
- 选择目标板型STM32H735G-DK,设置工程名后点击 Create;
- 无需修改 UI 界面,直接点击右下角 Run Target 生成代码,例程默认实现按钮控制计数加减功能。
步骤 2:为控件开启 ClickListener Mixin
- 在 TouchGFX Designer 主界面,选中画布上的计数文本框
countTxt; - 右侧属性栏找到Mixins选项,勾选ClickListener;
- 重新生成代码,完成控件的 Mixin 功能绑定。
步骤 3:代码实现点击交互逻辑
生成代码后,只需修改MainView.hpp和MainView.cpp两个文件,即可实现点击文本框数值 + 2 的功能。
1. MainView.hpp 声明回调与处理函数
在视图类中添加点击回调对象和处理函数声明:
#ifndef MAIN_VIEW_HPP
#define MAIN_VIEW_HPP
#include <gui_generated/main_screen/MainViewBase.hpp>
#include <gui/main_screen/MainPresenter.hpp>
class MainView : public MainViewBase
{
public:
MainView();
virtual ~MainView() {};
virtual void setupScreen();
virtual void increaseValue();
virtual void decreaseValue();
void updateGFXElements();
// 文本框点击处理函数
void cntTextClickHandler(const TextAreaWithOneWildcard& cntTxt, const ClickEvent& e);
protected:
private:
uint8_t count;
// 定义点击回调
Callback<MainView, const TextAreaWithOneWildcard&, const ClickEvent&> txtClickedCallback;
};
#endif // MAIN_VIEW_HPP
2. MainView.cpp 绑定回调与实现逻辑
- 构造函数中初始化回调,绑定处理函数;
- setupScreen 中为文本框设置点击动作;
- 实现点击处理函数,触发数值 + 2。
#include <gui/main_screen/MainView.hpp>
#include "BitmapDatabase.hpp"
const uint8_t UPPER_LIMIT = 42;
const uint8_t LOWER_LIMIT = 0;
// 构造函数:初始化回调
MainView::MainView()
: count(0)
, txtClickedCallback(this, &MainView::cntTextClickHandler)
{
}
void MainView::setupScreen()
{
updateGFXElements();
// 为文本框绑定点击回调
countTxt.setClickAction(txtClickedCallback);
}
// 文本框点击处理函数:释放时数值+2
void MainView::cntTextClickHandler(const TextAreaWithOneWildcard& cntTxt, const ClickEvent& e)
{
if (ClickEvent::RELEASED == e.getType())
{
increaseValue();
increaseValue();
}
}
// 计数增加函数(官方例程原有逻辑)
void MainView::increaseValue()
{
count = (count++ > UPPER_LIMIT) ? UPPER_LIMIT : count;
updateGFXElements();
}
3. 编译运行
编译代码并下载到开发板,点击计数文本框,数值会直接增加 2,点击功能完美实现。
3. ClickListener Mixin 底层原理解析
想要灵活使用 Mixin,必须理解其底层实现逻辑。ClickListener 是 TouchGFX 封装的标准类模板,源码位于ClickListener.hpp:
namespace touchgfx
{
template <class T>
class ClickListener : public T
{
public:
ClickListener() : T(), clickAction(0)
{
T::setTouchable(true);
}
// 处理点击事件
virtual void handleClickEvent(const ClickEvent& event)
{
T::handleClickEvent(event);
if (clickAction && clickAction->isValid())
{
clickAction->execute(*this, event);
}
}
// 设置点击回调
void setClickAction(GenericCallback<const T&, const ClickEvent&>& callback)
{
clickAction = &callback;
}
protected:
GenericCallback<const T&, const ClickEvent&>* clickAction;
};
}
核心原理
- 模板继承:
ClickListener<T>继承自控件基类T(如本文的TextAreaWithOneWildcard),自动继承控件所有属性和方法; - 自动开启触摸:构造函数中自动调用
setTouchable(true),让控件支持触摸响应; - 事件转发:重写
handleClickEvent,点击时先执行原生控件逻辑,再触发绑定的回调函数; - 回调绑定:通过
setClickAction绑定自定义回调,实现点击逻辑的灵活定制。
在自动生成的MainViewBase.hpp中,文本框的定义已被模板替换:
touchgfx::ClickListener<touchgfx::TextAreaWithOneWildcard> countTxt;
这意味着文本框已被扩展为支持点击的增强型控件,无需手动修改控件类型。
4. 开发总结与拓展
4.1 Mixin 使用核心优势
- 零成本扩展:无需自定义控件、无需修改底层源码,可视化勾选 + 少量代码即可实现功能扩展;
- 通用适配:支持所有 TouchGFX 标准控件,文本框、图像、容器等均可附加 ClickListener;
- 低侵入性:不破坏原有代码逻辑,兼容官方例程和自定义工程。
4.2 其他 Mixin 快速上手
掌握 ClickListener 后,可直接复用相同逻辑使用其他 Mixin:
- Draggable:勾选后直接支持拖拽,无需额外代码;
- FadeAnimator/MoveAnimator:勾选后调用动画接口,实现控件淡入淡出和位移动画。
4.3 开发注意事项
- 启用 ClickListener 后,控件会自动开启
Touchable属性,无需手动配置; - 点击处理函数中建议判断
ClickEvent::RELEASED,避免按下时重复触发; - 多个 Mixin 可同时勾选,实现拖拽 + 点击等组合功能。
TouchGFX 的 Mixin 模板功能,是嵌入式 GUI 开发的效率神器,尤其是 ClickListener,完美解决了普通控件的点击交互需求。本文基于 ST 官方 LAT1206 应用笔记的实战方法,无需深厚的 C++ 模板功底,就能快速实现控件功能扩展,适用于 STM32 全系列 TouchGFX 开发项目。
熟练掌握 Mixin 后,你可以轻松实现更复杂的 UI 交互,大幅提升嵌入式界面的开发效率和用户体验,这也是 TouchGFX 生态为 STM32 开发者提供的核心价值之一。
253