TouchGFX源码分析1---(Event类 和Click Event类)

一)Event 类

1)在 TouchGFX 中的地位和作用

1,事件处理核心地位:在 TouchGFX 框架中,Event类是事件处理机制的核心部分。它用于表示在用户界面(UI)交互过程中发生的各种事件,例如触摸屏幕、按下按钮、滑动操作等。这些事件是用户与图形界面进行交互的载体,通过对Event类的合理处理,应用程序能够根据用户的操作做出相应的响应,从而实现交互功能。

2,解耦交互与功能逻辑:Event类有助于将用户界面的交互逻辑与具体的功能实现相分离。这意味着开发人员可以在不改变底层功能代码的情况下,通过对Event类的操作和处理来改变用户界面的交互方式,反之亦然。例如,当用户触摸屏幕上的一个按钮时,Event类可以捕获这个触摸事件,然后将其传递给相应的处理函数,这个处理函数可以独立于按钮的绘制和显示逻辑,专注于实现按钮被按下后的功能(如打开一个新的界面、执行一段计算等)。

2)Event 类的主要成员和功能特性

1,事件类型成员:

Event类通常包含用于标识事件类型的成员变量。例如,可能会有一个枚举类型的变量来区分不同的事件,如触摸事件(TOUCH_EVENT)、按键事件(BUTTON_EVENT)、定时事件(TIMER_EVENT)等。这些事件类型的定义使得系统能够根据不同的事件来源和性质进行有针对性的处理。

2,事件源信息成员:

为了准确地处理事件,Event类可能会包含有关事件源的信息。如果是触摸事件,可能会包含触摸点的坐标;如果是按钮事件,可能会包含按钮的标识(如按钮的编号或名称)等信息。这些事件源相关的信息有助于确定事件发生的具体位置和对象,从而使应用程序能够精准地响应用户操作。

3,事件传递和处理机制相关成员:

Event类可能会涉及到事件的传递和处理机制。例如,它可能包含用于将事件发送到合适的事件处理器的函数或指针。在 TouchGFX 框架中,可能会有一个事件队列,Event类的对象会被放入这个队列中,然后按照一定的顺序被取出并发送到对应的事件处理器进行处理。这种机制确保了事件能够有序地被处理,并且可以根据应用程序的需求灵活地调整事件处理的优先级等特性。

3)事件处理流程中的 Event 类操作方式示例

1,事件产生阶段:

当用户在 TouchGFX 应用程序的界面上进行操作时,例如触摸屏幕,底层的输入设备驱动(如触摸屏控制器)会检测到这个操作,并生成一个对应的Event类对象。这个对象会被初始化,设置其事件类型为触摸事件(TOUCH_EVENT),并记录触摸点的坐标等相关信息作为事件源信息。

2,事件传递阶段:

生成的Event类对象会被传递到 TouchGFX 的事件管理系统中。这可能涉及到将事件放入一个事件队列中,等待进一步的处理。在这个阶段,Event类对象会在系统内部按照一定的规则(如先进先出的队列规则)进行传递,确保事件的顺序性和完整性。

3,事件处理阶段:

当事件从队列中被取出并发送到合适的事件处理器时,事件处理器会根据Event类对象所包含的事件类型和事件源信息来执行相应的操作。例如,如果是一个触摸按钮的事件,事件处理器会根据按钮的标识找到对应的按钮处理函数,然后执行该函数来实现按钮按下后的功能,如更新界面显示、执行一段业务逻辑等。在整个处理过程中,Event类对象就像是一个信息载体,将用户的操作信息准确地传递给应用程序的各个部分,使得应用程序能够做出正确的响应。

源码如下:

cpp 复制代码
#ifndef TOUCHGFX_EVENT_HPP
#define TOUCHGFX_EVENT_HPP

namespace touchgfx
{
	// 在这里放置属于这个命名空间(touchgfx命名空间名称)的代码,包括类、函数、变量等定义
	/** Simple base class for events. */
	class Event
	{
	public:
	    /** The event types. */
	    enum EventType//事件类型
	    {
	        EVENT_CLICK,  ///< A click 点击
	        EVENT_DRAG,   ///< A drag 拖动
	        EVENT_GESTURE ///< A gesture 手势
	    };
	    /** Default constructor. */
	    Event()//默认构造函数
	    {
	    }
	    /** Destructor. */
	    virtual ~Event()
	    {
	    }
		//下面的纯虚函数由以下函数重新实现:
		//touchgfx::ClickEvent::getEventType, 点击事件
		// touchgfx::DragEvent::getEventType, 拖动事件
		//touchgfx::GestureEvent::getEventType 手势事件
	    virtual EventType getEventType() const = 0;
	};

} // namespace touchgfx

#endif // TOUCHGFX_EVENT_HPP

/******************************************************************************
二)ClickEevent 类

1)核心事件类之一:在 TouchGFX 框架中,ClickEvent类是非常重要的事件类。它主要用于处理用户与图形用户界面(GUI)的点击交互,是实现用户通过点击按钮、列表项或其他可点击的 UI 元素来触发相应功能的关键部分。

2)驱动交互逻辑:ClickEvent类能够将用户的点击操作转化为应用程序可以理解和处理的事件。当用户点击屏幕上的某个元素时,会生成一个ClickEvent,这个事件随后被传递到相应的事件处理器,从而驱动整个应用程序的交互逻辑,例如打开一个新的屏幕、提交数据或者执行某种特定的任务。

cpp 复制代码
#ifndef TOUCHGFX_CLICKEVENT_HPP
#define TOUCHGFX_CLICKEVENT_HPP

#include <touchgfx/Event.hpp>
#include <touchgfx/hal/Types.hpp>

namespace touchgfx
{
	class ClickEvent : public Event
	{
	public:
	    /** Values that represent click event types. */
	    enum ClickEventType
	    {
	        PRESSED,  ///< An enum constant representing the pressed option
	        RELEASED, ///< An enum constant representing the released option
	        CANCEL    ///< An enum constant representing the cancel option
	    };
	    /**
	     * Initializes a new instance of the ClickEvent class.
	     *
	     * @param  type  The type of the click event.
	     * @param  x     The x coordinate of the click event.
	     * @param  y     The y coordinate of the click event.
	     * @param  force (Optional) The force of the click. On touch displays this usually means how
	     *               hard the user pressed on the display. On the windows platform, this
	     *               will always be zero.
	     */
	     //初始化类的构造函数
	    ClickEvent(ClickEventType type, int16_t x, int16_t y, int16_t force = 0)
	        : clickEventType(type), clickX(x), clickY(y), clickForce(force)
	    {
	    }
	     //拷贝构造函数
	    ClickEvent(const ClickEvent& clickEvent)
	    {
	        *this = clickEvent;
	    }
	    int16_t getX() const
	    {
	        return clickX;
	    }
	    int16_t getY() const
	    {
	        return clickY;
	    }
	    void setX(int16_t x)
	    {
	        clickX = x;
	    }
	    void setY(int16_t y)
	    {
	        clickY = y;
	    }
	    void setType(ClickEventType type)
	    {
	        clickEventType = type;
	    }
	    ClickEventType getType() const
	    {
	        return clickEventType;
	    }
	/**
	*获取单击的力度。在触摸屏上,这通常意味着用户有多努力
	*按在显示器上。
	*@return点击的力度。
	*/
	    int16_t getForce() const
	    {
	        return clickForce;
	    }
	    //返回事件类型
	    //重新实现:touchgfx::Event::getEventType
	    virtual Event::EventType getEventType() const
	    {
	        return Event::EVENT_CLICK;
	    }
	     //赋值运算符重载 拷贝赋值,浅拷贝
	    const ClickEvent& operator=(const ClickEvent& clickEvent)
	    {
	        clickEventType = clickEvent.clickEventType;
	        clickX = clickEvent.clickX;
	        clickY = clickEvent.clickY;
	        clickForce = clickEvent.clickForce;
	        return *this;
	    }
	
	private:
	    ClickEventType clickEventType;
	    int16_t clickX;
	    int16_t clickY;
	    int16_t clickForce;
	};

} // namespace touchgfx

#endif // TOUCHGFX_CLICKEVENT_HPP
相关推荐
无敌贵点大王7 小时前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表
恶魔泡泡糖10 小时前
stm32F103C8T6标准库串口接收之中断方式2
stm32·单片机·嵌入式硬件
充哥单片机设计10 小时前
【STM32开源项目】智能小区充电桩
stm32·单片机·嵌入式硬件·毕业设计·小区充电桩·智能小区充电桩
充哥单片机设计12 小时前
【STM32开源项目】智能语音台灯
stm32·单片机·嵌入式硬件·毕业设计·单片机设计·智能语音台灯
Brilliantwxx14 小时前
【STM32】 SPI阻塞式通信与HAL源码 (源码分析)
stm32·单片机·嵌入式硬件
WWJA王文举15 小时前
Bootloader、App 和升级分区之间是什么关系?
stm32·freertos·嵌入式开发·在线升级
LCG元16 小时前
STM32F103 NTC 热敏电阻测温实战:分压网络设计、Steinhart-Hart 标定与 ADC 采样优化实测
stm32·单片机·嵌入式硬件
怀民民民17 小时前
嵌入式软件学习路线与项目实践记录:STM32、FreeRTOS、Linux 与 OpenMV
stm32·freertos·嵌入式软件·嵌入式linux·openmv
辰域电子18 小时前
STM32项目开源:实验室消防预警控制系统(代码 + 原理图 + 仿真)
stm32·单片机·嵌入式硬件·开源·proteus
ysu_03141 天前
TinyML 模型部署:从 Edge Impulse 到 STM32F103
驱动开发·stm32·嵌入式硬件·mcu·硬件架构·硬件工程·dsp开发