扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

TouchGFX 控件 Mixin 功能实战:快速为控件附加 ClickListener 点击交互

03/31 14:36
253
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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:生成官方例程工程

  1. 打开 TouchGFX Designer,在 Examples 列表中选择Button Example;
  2. 选择目标板型STM32H735G-DK,设置工程名后点击 Create;
  3. 无需修改 UI 界面,直接点击右下角 Run Target 生成代码,例程默认实现按钮控制计数加减功能。

步骤 2:为控件开启 ClickListener Mixin

  1. 在 TouchGFX Designer 主界面,选中画布上的计数文本框countTxt
  2. 右侧属性栏找到Mixins选项,勾选ClickListener;
  3. 重新生成代码,完成控件的 Mixin 功能绑定。

步骤 3:代码实现点击交互逻辑

生成代码后,只需修改MainView.hppMainView.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 绑定回调与实现逻辑

  1. 构造函数中初始化回调,绑定处理函数;
  2. setupScreen 中为文本框设置点击动作;
  3. 实现点击处理函数,触发数值 + 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;
};
}

核心原理

  1. 模板继承:ClickListener<T>继承自控件基类T(如本文的TextAreaWithOneWildcard),自动继承控件所有属性和方法;
  2. 自动开启触摸:构造函数中自动调用setTouchable(true),让控件支持触摸响应;
  3. 事件转发:重写handleClickEvent,点击时先执行原生控件逻辑,再触发绑定的回调函数;
  4. 回调绑定:通过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 开发者提供的核心价值之一。

相关推荐