lvgl-文本框学习篇(五)

lvgl-文本框学习篇(五)

学习材料/工具

学习内容/过程

  • 零件和样式

  • 用法

    • 添加文字

    • 占位符

    • 删除字符

    • 移动光标

    • 隐藏光标

    • 光标闪烁时间

    • 单行模式

    • 密码模式

    • 文字对齐

    • 字符过滤

    • 最大文字长度

    • 长文本

    • 选择文字

    • 滚动条

    • 滚动传播

    • 边缘闪烁

  • 事件

  • 按键处理

  • 范例

    • 简单的文本框

    • 密码模式的文本区域

    • 文字自动格式化

简介

文本框(lv_textarea) 是一个带有标签的页面(lv_page)。可以在其中添加文本或字符。长行被换行,并且当文本变得足够长时,可以滚动文本区域。

零件和样式

文本与界面(lv_page)具有相同的部分。期望LV_PAGE_PART_SCRL,因为它不能被引用并且始终是透明的。请参阅页面的详细文档。

除了Page部分之外,还存在虚拟’LV_TETAREA_PART_CURSOR’部分来绘制光标。光标的区域始终是当前字符的边界框。可以通过在LV_TEXTAREA_PART_CURSOR的样式中添加背景色和背景色来创建块光标。创建行光标使光标透明并设置border_side属性。

用法
  1. 添加文字

可以使用以下命令将文本或字符插入当前光标的位置:

  • lv_textarea_add_char(textarea, ‘c’);

  • lv_textarea_add_text(textarea, “insert this text”);

要添加宽字符,例如’á’,'ß’或 CJK字符(中日韩统一表意文字),请使用
lv_textarea_add_text(textarea,“á”)。

lv_textarea_set_text(textarea, “New text”)更改整个文本。

  1. 占位符

可以使用lv_textarea_set_placeholder_text(textarea, “Placeholder text”)指定一个文本-当"文本"区域为空时显示。

  1. 删除字符

要从当前光标位置的左侧删除字符,请使用lv_textarea_del_char(textarea)。

要从右边删除,请使用lv_textarea_del_char(textarea)

  1. 移动光标

可以使用lv_textarea_set_cursor_pos(textarea,10)直接修改光标位置。0位置表示"在第一个字符之前",LV_TA_CURSOR_LAST表示"在最后一个字符之后"

可以使用

  • lv_textarea_cursor_right(textarea)
  • lv_textarea_cursor_left(textarea)
  • lv_textarea_cursor_up(textarea)
  • lv_textarea_cursor_down(textarea)

如果调用lv_textarea_set_cursor_click_pos(textarea,true),则光标将跳至单击"文本"区域的位置。

  1. 隐藏光标

可以使用lv_textarea_set_cursor_hidden(textarea, true)隐藏光标。

  1. 光标闪烁时间

光标的闪烁时间可以通过lv_textarea_set_cursor_blink_time(textarea,time_ms)进行调整.

  1. 单行模式

可以将"文本"区域配置为以lv_textarea_set_one_line(textarea,true)为一行。在此模式下,高度自动设置为仅显示一行,忽略换行符,并且禁用自动换行。

  1. 密码模式

文本区域支持可以通过lv_textarea_set_pwd_mode(textarea,true)启用的密码模式。

如果字体中存在(Bullet,U+2022)字符,则一段时间后或输入新字符后,输入的字符将转换为该字符。如果.u不存在,将使用*。

在密码模式下lv_textarea_get_text(textarea)给出真是文本,而不是项目符号字符。

可见时间可以使用lv_textarea_set_pwd_show_time(textarea, time_ms)进行调整。

  1. 文字对齐

可以使用lv_textarea_set_text_align(textarea, LV_TABEL_ALIGN_LET/CENTER/RIGHT)将文本左,中或右对齐。

  1. 字符过滤

可以使用lv_textarea_set_accepted_char(ta, “0123456789.±”)设置可接受字符的列表。其他字符将被忽略。

  1. 最大文本长度

最大字符可以通过lv_textarea_set_max_length(textarea, max_char_num)进行限制

  1. 长文本

如果"文本"区域中的文本很长(例如>20个字符),则其滚动和绘制速度可能会很慢。但是,通过在lv_conf.h中启用LV_LABEL_LONG_TXT_HINT 1可以极大地改善它。它将保存z一些有关标签的信息,以加快其绘制速度。使用LV_LABEL_LONG_TXT_HIN,滚动和绘图将与使"普通"短文本一样块。

  1. 选择文字

如果通过lv_textarea_set_text_sel(textarea,true)启用,则可以选择一部分文本。就像用鼠标在PC上选择文本时一样。

  1. 滚动条

可以根据lv_textarea_set_scrollbar_mode(textarea, LV_SCRLBAR_MODE_…)设置的不同策略显示滚动条。在Page对象中了解更多信息。

  1. 滚动传播

当"文本"区域在另一个可滚对象(如"页面")上滚动并且滚动已到达"文本"区域的边缘时,滚动可以传播到父对象。也就是说,当"文本"区域可以进一步滚动时,父级将 被滚动。

  1. 边缘闪烁

当"文本"区域滚动到边缘时,如果通过lv_ta_set_edge_flash(ta,true)启用,则可以显示类似Flash动画的圆圈

事件

除了通用事件,文本框还支持以下特殊事件:

  • LV_EVENT_INSERT:在插入字符或文本之前发送。事件数据是计划插入的文本。lv_ta_set_insert_replac(ta,“新文本”)替换要插入的文本。新文本不能位于局部变量中,该全局变量会在事件回调存在时被销毁。""表示请勿插入任何内容。

  • LV_EVENT_VALUE_CHANGED:当文本区域的内容已更改时。

  • LV_EVENT_APPLY:当LV_EKY_ENTER发送到处于单行模式的文本y区域时。

按键处理

文本框可处理以下按键:

  • LV_KEY_UP/DOWN/LEFT/RIGHT 移动光标

  • Any character 将字符添加到当前光标位置

了解有关按键的更多内容。

范例
  1. 简单的文本框
/**
 * @brief prvTextArea_Event_Handler
 * @param e
 */
static void prvTextArea_Event_Handler(lv_event_t *e)
{
    lv_obj_t *pGetEventTarget = lv_event_get_target(e);

    LV_UNUSED(pGetEventTarget);

    LV_LOG_USER("Enter was pressed. The current text is :%s",lv_textarea_get_text(pGetEventTarget));

}

/**
 * @brief prvButton_Event_Handler
 * @param e
 */
static void prvButton_Event_Handler(lv_event_t *e)
{
//    获取触发事件控件对象
    lv_obj_t *pObj = lv_event_get_target(e);

//    读取到文本框对象中
    lv_obj_t *pTextArea = lv_event_get_user_data(e);

//    获取触发对象的字符
    const char *pTxt = lv_btnmatrix_get_btn_text(pObj, lv_btnmatrix_get_selected_btn(pObj));

    if(strcmp(pTxt, LV_SYMBOL_BACKSPACE) == 0)
    {
//        按下删除键,则文本框中文字
        lv_textarea_del_char(pTextArea);

    }else if (strcmp(pTxt, LV_SYMBOL_NEW_LINE) == 0) {

//        按下换行时,如果时NULL,文本框不会行
        lv_event_send(pTextArea,LV_EVENT_READY,NULL);

    }else {
//        把矩阵按钮按下的值添加到文本框中
        lv_textarea_add_text(pTextArea, pTxt);
    }
}

/**
 * @brief prvSimpleTextArea
 */
static void prvSimpleTextArea(void)
{
//    创建文本框容器对象
    lv_obj_t *pTextAreaSimple = lv_textarea_create(lv_scr_act());

//    文本框对象设置单行模式
    lv_textarea_set_one_line(pTextAreaSimple,true);

//    文本框对象顶部居中对齐
    lv_obj_align(pTextAreaSimple, LV_ALIGN_TOP_MID,0,10);

//    文本框添加事件回调函数
    lv_obj_add_event_cb(pTextAreaSimple, prvTextArea_Event_Handler, LV_EVENT_READY,pTextAreaSimple);

//    确保文本框光标有效
    lv_obj_add_state(pTextAreaSimple, LV_STATE_FOCUSED);

//    构造按钮矩阵
    static const char *btnm_map[] = {"1", "2", "3", "\n",
                                     "4", "5", "6", "\n",
                                     "7", "8", "9", "\n",
                                     LV_SYMBOL_BACKSPACE, "0", LV_SYMBOL_NEW_LINE, ""
                                    };

//    创建按钮矩阵
    lv_obj_t *pBtnm = lv_btnmatrix_create(lv_scr_act());

    lv_obj_set_size(pBtnm,200,150);

    lv_obj_align(pBtnm, LV_ALIGN_BOTTOM_MID,0,-10);

    lv_obj_add_event_cb(pBtnm, prvButton_Event_Handler,LV_EVENT_VALUE_CHANGED,pTextAreaSimple);

//    当按下时,触发按钮聚焦
    lv_obj_clear_flag(pBtnm, LV_OBJ_FLAG_CLICK_FOCUSABLE);

//    设置控制属性时可以通过一个map直接设置所有的按钮。
    lv_btnmatrix_set_map(pBtnm, btnm_map);

}

  1. 密码文本框

// 键盘对象
static lv_obj_t *pKB_g;

/**
 * @brief prvTextArea_Event_Handler
 * @param e
 */
static void prvTextArea_Event_Handler(lv_event_t *e)
{
//    获取事件代码
    lv_event_code_t  pGetEventCode = lv_event_get_code(e);

//    获取事件对象
    lv_obj_t *pGetEventTarget = lv_event_get_target(e);

    LV_UNUSED(pGetEventTarget);

    LV_LOG_USER("Enter was pressed. The current text is :%s",lv_textarea_get_text(pGetEventTarget));

    if(pGetEventCode == LV_EVENT_CLICKED || pGetEventCode == LV_EVENT_FOCUSED)
    {
        if(pKB_g != NULL) lv_keyboard_set_textarea(pKB_g,pGetEventTarget);

    }else if (pGetEventCode == LV_EVENT_READY) {

        LV_LOG_USER("The current text is :%s",lv_textarea_get_text(pGetEventTarget));

    }

}

/**
 * @brief prvPwdFieldTextArea
 */
static void prvPwdFieldTextArea(void)
{
//    创建密码文本框
    lv_obj_t *pPwdTextArea = lv_textarea_create(lv_scr_act());

    lv_textarea_set_text(pPwdTextArea,"");

//    文本框设置成密码模式
    lv_textarea_set_password_mode(pPwdTextArea,true);

//    文本框设置单行模式
    lv_textarea_set_one_line(pPwdTextArea,true);

//    设置文本框的宽度
    lv_obj_set_width(pPwdTextArea,lv_pct(40));

//    设置文本框的位置
    lv_obj_set_pos(pPwdTextArea, 5, 20);

//    密码文本框添加事件
    lv_obj_add_event_cb(pPwdTextArea,prvTextArea_Event_Handler,LV_EVENT_ALL,NULL);

//    创建标签容器对象
    lv_obj_t *pPwdLbl = lv_label_create(lv_scr_act());

//    设置标签对象的文本值
    lv_label_set_text(pPwdLbl, "PassWord:");

//    设置密码文本框和标签对象水平对齐
    lv_obj_align_to(pPwdLbl, pPwdTextArea,LV_ALIGN_OUT_TOP_LEFT,0,0);

    lv_obj_t *pTxtTextArea = lv_textarea_create(lv_scr_act());

    lv_textarea_set_one_line(pTxtTextArea,true);

    lv_textarea_set_password_mode(pTxtTextArea,true);

    lv_obj_set_width(pTxtTextArea,lv_pct(40));

    lv_obj_add_event_cb(pTxtTextArea,prvTextArea_Event_Handler,LV_EVENT_ALL,NULL);

    lv_obj_align(pTxtTextArea, LV_ALIGN_TOP_RIGHT,-5,20);

    lv_obj_t *pOnelineLbl = lv_label_create(lv_scr_act());

    lv_label_set_text(pOnelineLbl, "Text:");

    lv_obj_align_to(pOnelineLbl,pTxtTextArea, LV_ALIGN_OUT_TOP_LEFT,0,0);

//    创建键盘容器对象
    pKB_g = lv_keyboard_create(lv_scr_act());

//    设置键盘大小
    lv_obj_set_size(pKB_g, LV_HOR_RES, LV_VER_RES/2);

//    将密码文本框的聚焦在文本区域的开始
    lv_keyboard_set_textarea(pKB_g,pPwdTextArea);

}

  1. 文字自动格式化
/**
 * @brief prvAutoTextFmt_Handler
 * @param e
 */
static void prvAutoTextFmt_Handler(lv_event_t *e)
{

    lv_obj_t *pAtTxtFmtEventTarget = lv_event_get_target(e);

    const char *pTxt = lv_textarea_get_text(pAtTxtFmtEventTarget);

    if(pTxt[0] >= '0' && pTxt[0] <= '9' &&
           pTxt[1] >= '0' && pTxt[1] <= '9' &&
           pTxt[2] != ':') {
            lv_textarea_set_cursor_pos(pAtTxtFmtEventTarget, 2);
            lv_textarea_add_char(pAtTxtFmtEventTarget, ':');
        }


}

/**
 * @brief prvAutoTextFormatting
 */
static void prvAutoTextFormatting(void)
{
    lv_obj_t *pAutoTextFmtting = lv_textarea_create(lv_scr_act());

    lv_obj_add_event_cb(pAutoTextFmtting, prvAutoTextFmt_Handler,LV_EVENT_VALUE_CHANGED,NULL);

//    字符过滤
    lv_textarea_set_accepted_chars(pAutoTextFmtting,"0123456789:");

//    设置文本最大长度
    lv_textarea_set_max_length(pAutoTextFmtting,5);

    lv_textarea_set_one_line(pAutoTextFmtting,true);

    lv_textarea_set_text(pAutoTextFmtting,"");

    pKB_g = lv_keyboard_create(lv_scr_act());

    lv_obj_set_size(pKB_g, LV_HOR_RES, LV_VER_RES/2);

    lv_keyboard_set_mode(pKB_g, LV_KEYBOARD_MODE_NUMBER);

    lv_keyboard_set_textarea(pKB_g, pAutoTextFmtting);

	//    设置文本最大长度
    lv_textarea_set_max_length(pAutoTextFmtting,5);

    lv_textarea_set_one_line(pAutoTextFmtting,true);

    lv_textarea_set_text(pAutoTextFmtting,"");

    pKB_g = lv_keyboard_create(lv_scr_act());

    lv_obj_set_size(pKB_g, LV_HOR_RES, LV_VER_RES/2);

    lv_keyboard_set_mode(pKB_g, LV_KEYBOARD_MODE_NUMBER);

    lv_keyboard_set_textarea(pKB_g, pAutoTextFmtting);

}

学习结果

本篇文章主要记录了如何使用lv_textarea(文本框)。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值