13. 文本区域部件

一、文本区域部件

  文本域部件就是我们常用的文本输入框,用户可以在其中输入所需文本。文本区域部件由五个部分组成:

  • 主体LV_PART_MAIN):可设置背景属性以及文本样式属性。
  • 滚动条LV_PART_SCROLLBAR):可设置滚动条样式属性。
  • 所选文本LV_PART_SELECTED):可设置所选文本的样式。
  • 光标LV_PART_CURSOR):设置光标的位置、闪烁时间和样式属性。
  • 占位符LV_PART_TEXTAREA_PLACEHOLDER):可设置占位符(提示文本)的样式。

  LVGL 官方提供了一些与文本区域部件相关 API。

lv_obj_t * lv_textarea_create(lv_obj_t * parent);                               // 创建文本区域对象

void lv_textarea_add_char(lv_obj_t * obj, uint32_t c);                          // 插入一个字符到当前光标位置
void lv_textarea_delete_char(lv_obj_t * obj);                                   // 删除当前光标左侧的字符
void lv_textarea_delete_char_forward(lv_obj_t * obj);                           // 删除当前光标右侧的字符

void lv_textarea_add_text(lv_obj_t * obj, const char * txt);                    // 将文本插入到当前光标位置

void lv_textarea_set_text(lv_obj_t * obj, const char * txt);                    // 设置文本
const char * lv_textarea_get_text(const lv_obj_t * obj);                        // 获取文本区域的文本

void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt);        // 设置占位符文本
const char * lv_textarea_get_placeholder_text(lv_obj_t * obj);                  // 获取文本区域的占位符文本

lv_obj_t * lv_textarea_get_label(const lv_obj_t * obj);                         // 获取文本区域的标签

void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos);                   // 设置光标位置
uint32_t lv_textarea_get_cursor_pos(const lv_obj_t * obj);                      // 获取当前光标在字符索引中的位置

void lv_textarea_cursor_up(lv_obj_t * obj);                                     // 将光标向上移动一个字符
void lv_textarea_cursor_down(lv_obj_t * obj);                                   // 将光标向下移动一个字符
void lv_textarea_cursor_left(lv_obj_t * obj);                                   // 将光标向左移动一个字符
void lv_textarea_cursor_right(lv_obj_t * obj);                                  // 将光标向右移动一个字符

void lv_textarea_set_cursor_click_pos(lv_obj_t * obj, bool en);                 // 启用/禁用光标的位置
bool lv_textarea_get_cursor_click_pos(lv_obj_t * obj);                          // 获取是否启用光标单击定位

void lv_textarea_set_password_mode(lv_obj_t * obj, bool en);                    // 设置密码模式
bool lv_textarea_get_password_mode(const lv_obj_t * obj);                       // 获取密码模式属性

void lv_textarea_set_password_show_time(lv_obj_t * obj, uint32_t time);         // 将密码更改为“*”之前显示多长时间
uint32_t lv_textarea_get_password_show_time(lv_obj_t * obj);                    // 获取密码更改为“*”之前显示的时间

void lv_textarea_set_one_line(lv_obj_t * obj, bool en);                         // 设置单行模式
bool lv_textarea_get_one_line(const lv_obj_t * obj);                            // 查看是否启用了一行模式

void lv_textarea_set_text_selection(lv_obj_t * obj, bool en);                   // 启用/禁用选择模式
bool lv_textarea_get_text_selection(lv_obj_t * obj);                            // 查看是否启用了选择模式

bool lv_textarea_text_is_selected(const lv_obj_t * obj);                        // 查找文本是否被选中
void lv_textarea_clear_selection(lv_obj_t * obj);                               // 清除文本区域上的选择

void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list);         // 限制输入字符的类型
const char * lv_textarea_get_accepted_chars(lv_obj_t * obj);                    // 获取可接收字符的列表

void lv_textarea_set_max_length(lv_obj_t * obj, uint32_t num);                  // 限制输入字符的长度
uint32_t lv_textarea_get_max_length(lv_obj_t * obj);                            // 获取文本区域的最大长度

void lv_textarea_set_insert_replace(lv_obj_t * obj, const char * txt);          // 文本区域添加自动格式

  我们可以使用 lv_textarea_create() 函数 创建文本区域部件

/**
 * @brief 创建文本区域对象
 * 
 * @param parent 指向父部件的指针
 * @return lv_obj_t* 指向文本区域部件的指针
 */
lv_obj_t * lv_textarea_create(lv_obj_t * parent);

  文本区域部件就是一个文本输入框, 用户可以在该部件的文本区域中输入字符和删除字符。用户需要在文本区域中 添加一个字符或者一段字符串,可分别调用 lv_textarea_add_char()lv_textarea_add_text() 函数。

/**
 * @brief 插入一个字符到当前光标位置
 * 
 * @param obj 指向文本区域部件的指针
 * @param c 要插入的字符
 */
void lv_textarea_add_char(lv_obj_t * obj, uint32_t c);
/**
 * @brief 将文本插入到当前光标位置
 * 
 * @param obj 指向文本区域部件的指针
 * @param txt 要插入的字符串
 */
void lv_textarea_add_text(lv_obj_t * obj, const char * txt);

  在 LVGL 中,我们可以调用 lv_textarea_delete_char() 函数,从光标位置的左侧删除一个字符,也可以调用 lv_textarea_delete_char_forward() 函数,从光标位置的右侧删除一个字符

/**
 * @brief 删除当前光标左侧的字符
 * 
 * @param obj 指向文本区域部件的指针
 */
void lv_textarea_delete_char(lv_obj_t * obj);
/**
 * @brief 删除当前光标右侧的字符
 * 
 * @param obj 指向文本区域部件的指针
 */
void lv_textarea_delete_char_forward(lv_obj_t * obj);

  占位符(Placeholder)即默认显示的文本,常用于对用户进行默认的提示、说明或引导。在 LVGL 中,用户可调用 lv_textarea_set_placeholder_text() 函数 设置占位文本

/**
 * @brief 设置占位符文本
 * 
 * @param obj 指向文本区域部件的指针
 * @param txt 占位文本
 */
void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt);

  在 LVGL 中,文本区域的光标默认在左上角的位置。当我们添加一个字符时,该光标从左往右移动,默认情况下,光标会一直在文本最后一个字符的右侧。如果用户需要 设置光标的位置,可调用 lv_textarea_set_cursor_pos() 函数,该函数的第二个形参表示光标的移动位置,当该形参设置为 0,则光标在第一个字符之前;当该形参设置为 LV_TA_CURSOR_LAST,则光标在最后一个字符之后。

/**
 * @brief 设置光标位置
 * 
 * @param obj 指向文本区域部件的指针
 * @param pos 光标的移动位置
 */
void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos);

  如果用户不想使用上述的方式设置光标的位置,可使用以下函数,单步移动光标

void lv_textarea_cursor_up(lv_obj_t * obj);                                     // 将光标向上移动一个字符
void lv_textarea_cursor_down(lv_obj_t * obj);                                   // 将光标向下移动一个字符
void lv_textarea_cursor_left(lv_obj_t * obj);                                   // 将光标向左移动一个字符
void lv_textarea_cursor_right(lv_obj_t * obj);                                  // 将光标向右移动一个字符

  在 LVGL 中,文本区域部件的特殊模式有两个:单行模式密码模式

  • 单行模式:默认情况下,文本区域的文本超出它的宽度时,该文本将自动换行。如果将文本区域部件设置为单行模式,当它的文本超出其宽度后,文本并不会自动换行,超出的文本将水平滚动显示。单行模式可通过 lv_textarea_set_one_line() 函数进行设置。
  • 密码模式:为了保证文本的机密性,LVGL 的文本区域部件为用户提供了密码模式,当用户输入文本之后,这些文本内容将以“*”字符替代。用户需要设置密码模式,可调用 lv_textarea_set_password_mode() 函数。
/**
 * @brief 设置单行模式
 * 
 * @param obj 指向文本区域部件的指针
 * @param en true: 启用; false: 不启用
 */
void lv_textarea_set_one_line(lv_obj_t * obj, bool en);
/**
 * @brief 设置密码模式
 * 
 * @param obj 指向文本区域部件的指针
 * @param en true: 启用; false: 不启用
 */
void lv_textarea_set_password_mode(lv_obj_t * obj, bool en);

当用户使用密码模式时,原始文本会先显示一段时间,然后隐藏,该显示时间可以在 lv_conf.h 文件的 LV_TEXTAREA_DEF_PWD_SHOW_TIME 宏定义中设置。

如果用户想获取密码框的文本内容,可调用 lv_textarea_get_text() 函数,返回的文本并不是“*”字符,而是原始的文本内容。

  文本区域部件可以限制输入字符的范围。LVGL 文本区域部件限制输入字符的内容有两个:限制字符类型限制字符长度

  • 限制字符类型,它只能输入数字 0~9。用户需要限制字符类型,可以调用 lv_textarea_set_accepted_chars() 函数进行设置。
  • 限制字符长度,,它只能输入 6 位密码。用户需要限制字符长度,可以调用 lv_textarea_set_max_length() 函数进行设置。
/**
 * @brief 限制输入字符的类型
 * 
 * @param obj 指向文本区域部件的指针
 * @param list 允许输入的字符列表指针
 */
void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list);
/**
 * @brief 限制输入字符的长度
 * 
 * @param obj 指向文本区域部件的指针
 * @param num 限制输入字符的长度
 */
void lv_textarea_set_max_length(lv_obj_t * obj, uint32_t num);

二、实验例程

#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"

lv_obj_t *label;

int main(void)
{
    HAL_Init();
    System_Clock_Init(8, 336, 2, 7);
    Delay_Init(168);

    SPI_Simulate_Init();
    // SRAM_Init();
    TIM_Base_Init(&g_tim6_handle, TIM6, 83, 999);
    __HAL_TIM_CLEAR_IT(&g_tim6_handle, TIM_IT_UPDATE);                          // 清除更新中断标志位
    HAL_TIM_Base_Start_IT(&g_tim6_handle);                                      // 使能更新中断,并启动计数器

    lv_init();
    lv_port_disp_init();
    lv_port_indev_init();

    // 测试代码
    label = lv_label_create(lv_scr_act());                                      // 创建标签部件
    lv_obj_set_align(label, LV_ALIGN_TOP_MID);                                  // 设置标签部件考上居中对齐
    lv_obj_set_style_text_font(label, &lv_font_montserrat_30, LV_PART_MAIN);    // 设置标签部件的字体样式
    lv_label_set_text(label, "textArea test");                                  // 设置标签部件的文本

    lv_obj_t *textArea = lv_textarea_create(lv_scr_act());                      // 创建文本区域部件
    lv_obj_align(textArea, LV_ALIGN_TOP_MID, 0, 50);                            // 设置文本区域部件考上居中对齐

    lv_obj_t *keyBoard = lv_keyboard_create(lv_scr_act());                      // 创建键盘部件
    lv_keyboard_set_textarea(keyBoard, textArea);                               // 关联键盘部件和文本区域部件

    lv_textarea_set_one_line(textArea, true);                                   // 设置单行模式
    lv_textarea_set_password_mode(textArea, true);                              // 设置密码模式
    lv_textarea_set_password_show_time(textArea, 1000);                         // 设置密码显示时间
    lv_textarea_set_accepted_chars(textArea, "1234567890");                     // 设置允许输入的字符
    lv_textarea_set_max_length(textArea, 6);                                    // 设置最大字符长度
    lv_textarea_set_placeholder_text(textArea, "Please enter password");        // 设置占位符

    lv_obj_add_event_cb(textArea, textArea_event_cb, LV_EVENT_VALUE_CHANGED, NULL);

    while (1)
    {
        lv_timer_handler();
        Delay_ms(5);
    }
  
    return 0;
}
void textArea_event_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);                                // 获取事件的触发类型
    lv_obj_t *target = lv_event_get_target(e);                                  // 获取事件的触发源
    const char *text;

    if(code == LV_EVENT_VALUE_CHANGED)
    {
        text = lv_textarea_get_text(target);                                    // 获取文本
        lv_label_set_text(label, text);
    }
}
posted @ 2024-06-17 21:22  星光映梦  阅读(98)  评论(0编辑  收藏  举报