BWSU 发表于 2025-4-15 15:16:22

触摸输入框控件

触摸输入框控件
这是一个基于RA8889/RA6809显示控制器的输入框控件实现,提供了完整的文本输入功能,包括光标显示、文本编辑、触摸输入等功能。


一、功能特点
[*]多输入框支持

[*]支持同时创建和管理多个输入框
[*]每个输入框可以独立设置位置、大小和样式
[*]支持标签显示
[*]文本输入功能

[*]支持字符输入和删除
[*]支持光标位置控制
[*]支持文本长度限制
[*]支持中英文输入
[*]触摸交互

[*]支持触摸选择输入框
[*]支持触摸位置计算光标位置
[*]支持点击输入框外部取消焦点
[*]视觉效果

[*]3D边框效果
[*]活动状态高亮显示
[*]光标闪烁效果
[*]文本垂直居中显示
[*]RA8889特性

[*]使用RA8889内建光标功能
[*]支持12x24字体显示
[*]支持16M色显示


二、文件结构输入框控件v1.0/
├── widget/
│   ├── inputbox.c    # 输入框控件实现
│   └── inputbox.h    # 输入框控件头文件
├── RA8889_01_Kernel/
│   ├── RA8889_51.c   # RA8889底层驱动
│   ├── RA8889_51.h
│   ├── RA8889_API_51.c# RA8889 API实现
│   └── RA8889_API_51.h
└── UserDef.h         # 用户定义配置
三、主要API初始化void InputBox_Init(void);初始化输入框控件,设置RA8889光标参数。
创建输入框int InputBox_Add(int x, int y, int width, const char* initial_text,
                int label_x, int label_y, const char* label,
                unsigned long text_color, unsigned long label_color);添加一个新的输入框,返回输入框ID。
文本操作void InputBox_SetText(int id, const char* text);
const char* InputBox_GetText(int id);
void InputBox_AddChar(int id, char ch);
void InputBox_DeleteChar(int id);设置、获取文本,添加和删除字符。

显示控制void InputBox_Draw(int id);
void InputBox_DrawAll(void);绘制单个或所有输入框。

触摸处理int InputBox_HandleTouch(int touch_x, int touch_y);处理触摸事件,返回被触摸的输入框ID。

焦点控制void InputBox_SetActive(int id, int active);设置输入框的活动状态。

四、触摸处理详解触摸处理是该输入框控件的核心功能之一。InputBox_HandleTouch函数实现了所有触摸交互逻辑,包括:

输入框选择
[*]触摸事件过滤

[*]忽略坐标为(0,0)或负值的触摸点,避免触摸释放事件误触发焦点丢失
[*]仅处理有效区域内的触摸事件
[*]输入框命中检测

[*]检查触摸坐标是否在任何输入框的范围内
[*]确定被触摸的输入框ID
[*]焦点切换

[*]如果触摸了新的输入框,自动切换焦点
[*]如果触摸了当前已有焦点的输入框,保持焦点
[*]如果触摸了输入框外部的有效区域,取消当前输入框的焦点
光标位置计算
[*]精确定位

[*]根据触摸点在输入框内的X坐标计算光标位置
[*]将触摸点X坐标转换为字符位置(根据12x24字体宽度)
[*]边界处理

[*]在输入框左边缘点击时,光标位置设为0(文本开始位置)
[*]当计算出的位置超过文本长度时,光标位置自动设为文本末尾


视觉反馈
[*]输入框状态切换

[*]当输入框获得焦点时,边框颜色变为高亮(蓝色)
[*]输入框失去焦点时,边框恢复默认颜色
[*]光标显示

[*]使用RA8889的内建光标功能
[*]自动闪烁(10帧周期)
[*]当输入框获得焦点时显示光标
[*]当输入框失去焦点时隐藏光标


实现要点
[*]事件处理顺序
触摸事件 -> 输入框命中检测 -> 焦点管理 -> 光标位置计算 -> 状态更新 -> 视觉反馈
[*]全局状态维护

[*]active_input_box_id保存当前活动输入框ID
[*]widget_input_id用于跟踪被触摸的输入框ID,供其他部分代码使用(如键盘输入)
[*]关键触摸事件处理

[*]点击输入框:获得焦点,更新光标位置
[*]点击文本:光标定位到点击的字符位置
[*]点击输入框外部:取消当前焦点
[*]误触处理

[*]忽略无效坐标(<=0)的触摸事件
[*]确保触摸释放事件不会导致焦点丢失


五、配置参数在UserDef.h中定义了以下主要配置:
<pre><code>#define MAX_INPUT_BOXES 10          // 最大输入框数量</code></pre><pre><code>#define INPUT_BOX_HEIGHT 40         // 输入框高度</code></pre><pre><code>#define INPUT_BOX_BORDER_WIDTH 2    // 边框宽度</code></pre><pre><code>#define INPUT_BOX_PADDING 4         // 内边距</code></pre><pre><code>#define INPUT_BOX_SHADOW_DEPTH 2    // 阴影深度</code></pre><pre><code>#define INPUT_BOX_BG_COLOR 0xFFFFFF // 背景色</code></pre><pre><code>#define INPUT_BOX_ACTIVE_BORDER_COLOR 0x0000FF// 活动状态边框颜色</code></pre><pre><code>#define INPUT_BOX_ACTIVE_BORDER_COLOR_1 0xFFFF00 // 活动状态边框外围颜色</code></pre><h2></h2>
六、使用示例// 初始化
InputBox_Init();

// 创建输入框
InputBox_Add(300, 200, 400, "The label color can be changed.", -12*4-8, 8, "Name", color16M_black, color16M_red);

// 设置活动状态
InputBox_SetActive(id, 1);

// 处理触摸事件int touched_id = InputBox_HandleTouch(touch_x, touch_y);

// 添加字符
InputBox_AddChar(id, 'A');

// 删除字符
InputBox_DeleteChar(id);

// 获取文本const char* text = InputBox_GetText(id);
七、注意事项
[*]需要定期调用InputBox_UpdateCursor()更新光标状态
[*]触摸坐标需要转换为屏幕坐标
[*]文本长度受限于MAX_TEXT_LENGTH定义
[*]RA8889内建字体大小固定为12x24,本例仅调用内建字体


八、依赖项
[*]RA8889显示控制器驱动
[*]标准C库(string.h)
[*]用户自定义配置(UserDef.h)

九、源码下载
请至菜单栏“组件与控件”下载。

十、视频演示
https://www.bilibili.com/video/BV1xTopYdESi/?share_source=copy_web&vd_source=c0cd4c87f6dcc19bcebab2f4cf3c40db





页: [1]
查看完整版本: 触摸输入框控件