嵌入式GUI LVGL『Text Area文本区域控件』介绍

Posted Wireless_Link

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式GUI LVGL『Text Area文本区域控件』介绍相关的知识,希望对你有一定的参考价值。

一. LVGL GUI文本区域控件的概念

文本区域是一个带有标签和光标的页面。文本或字符可以添加到它。长行被换行,当文本足够长时,可以滚动文本区域。

二. LVGL GUI文本区域小部件和样式

文本区域与页面部分相同。除了使用LV_PAGE_PART_SCRL,因为它不能被引用,而且它总是透明的。请参阅本页的详细文档。

除了页面部分之外,还存在虚拟的LV_TEXTAREA_PART_CURSOR部分来绘制光标。光标的区域总是当前字符的边界框。可以通过在LV_TEXTAREA_PART_CURSOR的样式中添加背景颜色和背景opa来创建块游标。create line游标允许游标透明并设置border_side属性。

三. LVGL GUI文本区域控件的使用

1. 增加文本(Add text)

通过这个函数lv_textarea_add_char(textarea, 'c')来添加一个字符

通过这个函数lv_textarea_add_text(textarea, "insert this text")来添加字符串

通过这个函数lv_textarea_set_text(ta, "New text")来改变整个文本区域的值

2. 占位符(Placeholder)

通过这个函数lv_textarea_set_placeholder_text(ta, "Placeholder text")设置占位符

3. 删除字符(Delete character)

通过这个函数lv_textarea_del_char(textarea)删除左边的字符,类似Backspack功能

通过这个函数lv_textarea_del_char_forward(textarea)删除右边的字符,类似Delete功能

4. 移动光标(Move the cursor)

通过这个函数设置光标位置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)

5. 隐藏光标(Hide the cursor)

通过这个函数lv_textarea_set_cursor_hidden(textarea, true)隐藏光标

6. 广播闪烁时间(Cursor blink time)

通过这个函数lv_textarea_set_cursor_blink_time(textarea, time_ms)来设置光标闪烁时间

7. 一行模式(One line mode)

文本区域可以配置为一行lv_textarea_set_one_line(ta, true)。在这种模式下,高度被自动设置为只显示一行,换行符被忽略,换行符被禁用。

8. 密码模式(Password mode)

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

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

在密码模式下lv_textarea_get_text(textarea)给出的是真实的文本,而不是子弹字符。

可见时间可以通过lv_textarea_set_pwd_show_time(textarea, time_ms)来调整

9. 文本对齐(Text align)

通过这个函数lv_textarea_set_text_align(textarea, LV_LABEL_ALIGN_LET/CENTER/RIGHT)来设置文本对齐

10. 接受字符(Accepted characters)

您可以使用lv_textarae_set_accepted_chars(ta, "0123456789.+-")设置一个接受的字符列表。其他字符将被忽略。

11. 最大文本长度(Max text length)

通过这个函数lv_textarea_set_max_length(textarea, max_char_num)来设置最大文本长度

12. 超长文本(Very long texts)

如果在文本区域有一个很长的文本(例如 >2万字符)它的滚动和绘图可能很慢。但是,通过在lv_conf.h中启用LV_LABEL_LONG_TXT_HINT 1,可以极大地改进。它将节省一些关于标签的信息,以加快其绘图。使用LV_LABEL_LONG_TXT_HINT,滚动和绘制将与“正常”短文本一样快。

13. 选择文本(Select text)

部分文本可以选择,如果启用lv_textarea_set_text_sel(textarea, true)。它的工作原理就像你用鼠标在电脑上选择文本一样。

14. 滚动条(Scrollbars)

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

15. 滚动传播(Scroll propagation)

当在另一个可滚动对象(如页面)上滚动文本区域时,滚动已经到达文本区域的边缘,滚动可以传播到父对象。换句话说,当文本区域可以进一步滚动时,父区域将被滚动。

可以使用lv_ta_set_scroll_propagation(ta, true)启用它。

16. 边缘闪烁(Edge flash)

当文本区域滚动到边缘时,如果启用lv_ta_set_edge_flash(ta, true),可以显示一个类似flash动画的圆圈。

17. 事件(Event)

除了基本的时间外,有以下特殊事件

  • LV_EVENT_INSERT Sent when before a character or text is inserted. The event data is the text planned to insert. lv_ta_set_insert_replace(ta, "New text") replaces the text to insert. The new text can't be in a local variable which is destroyed when the event callback exists. "" means do not insert anything.

  • LV_EVENT_VALUE_CHANGED When the content of the text area has been changed.

  • LV_EVENT_APPLY When LV_KEY_ENTER is sent to a text area which is in one line mode.

文本区域空间我们就不一一举例了,我们来几个综合例子

例子一:

lv_obj_t* ta1;
static void text_area_event_handler(lv_obj_t* obj, lv_event_t event)

    if (event == LV_EVENT_INSERT)
    
        printf("LV_EVENT_INSERT\\n");
    
    if (event == LV_EVENT_VALUE_CHANGED) 
        printf("Value: %s\\n", lv_textarea_get_text(obj));
    
    else if (event == LV_EVENT_LONG_PRESSED_REPEAT) 
        /*For simple test: Long press the Text are to add the text below*/
        const char* txt = "\\n\\nYou can scroll it if the text is long enough.\\n";
        static uint16_t i = 0;
        if (txt[i] != '\\0') 
            lv_textarea_add_char(ta1, txt[i]);
            i++;
        
    


void lvgl_text_area_test1(void)

    ta1 = lv_textarea_create(lv_scr_act(), NULL);
    lv_obj_set_size(ta1, 200, 100);
    lv_obj_align(ta1, NULL, LV_ALIGN_CENTER, 0, 0);
    lv_textarea_set_text(ta1, "A text in a Text Area");    /*Set an initial text*/
    lv_obj_set_event_cb(ta1, text_area_event_handler);

例子一效果:

例子二

static void text_area2_event_cb(lv_obj_t* ta, lv_event_t event);

static lv_obj_t* kb;

void lvgl_text_area_test2(void)

    /* Create the password box */
    lv_obj_t* pwd_ta = lv_textarea_create(lv_scr_act(), NULL);
    lv_textarea_set_text(pwd_ta, "");
    lv_textarea_set_pwd_mode(pwd_ta, true);
    lv_textarea_set_one_line(pwd_ta, true);
    lv_textarea_set_cursor_hidden(pwd_ta, true);
    lv_obj_set_width(pwd_ta, LV_HOR_RES / 2 - 20);
    lv_obj_set_pos(pwd_ta, 5, 20);
    lv_obj_set_event_cb(pwd_ta, text_area2_event_cb);

    /* Create a label and position it above the text box */
    lv_obj_t* pwd_label = lv_label_create(lv_scr_act(), NULL);
    lv_label_set_text(pwd_label, "Password:");
    lv_obj_align(pwd_label, pwd_ta, LV_ALIGN_OUT_TOP_LEFT, 0, 0);

    /* Create the one-line mode text area */
    lv_obj_t* oneline_ta = lv_textarea_create(lv_scr_act(), pwd_ta);
    lv_textarea_set_pwd_mode(oneline_ta, false);
    lv_textarea_set_cursor_hidden(oneline_ta, true);
    lv_obj_align(oneline_ta, NULL, LV_ALIGN_IN_TOP_RIGHT, -5, 20);


    /* Create a label and position it above the text box */
    lv_obj_t* oneline_label = lv_label_create(lv_scr_act(), NULL);
    lv_label_set_text(oneline_label, "Text:");
    lv_obj_align(oneline_label, oneline_ta, LV_ALIGN_OUT_TOP_LEFT, 0, 0);

    /* Create a keyboard */
    kb = lv_keyboard_create(lv_scr_act(), NULL);
    lv_obj_set_size(kb, LV_HOR_RES, LV_VER_RES / 2);

    lv_keyboard_set_textarea(kb, pwd_ta); /* Focus it on one of the text areas to start */
    lv_keyboard_set_cursor_manage(kb, true); /* Automatically show/hide cursors on text areas */


static void text_area2_event_cb(lv_obj_t* ta, lv_event_t event)

    if (event == LV_EVENT_CLICKED) 
        /* Focus on the clicked text area */
        if (kb != NULL)
            lv_keyboard_set_textarea(kb, ta);
    

    else if (event == LV_EVENT_INSERT) 
        const char* str = lv_event_get_data();
        if (str[0] == '\\n') 
            printf("Ready\\n");
        
    

效果

好了,完结了,更多精彩继续戳↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

以上是关于嵌入式GUI LVGL『Text Area文本区域控件』介绍的主要内容,如果未能解决你的问题,请参考以下文章

css Flexbox:收缩时切换卡文本轴

占位符文本未出现在文本区域中

菜单列表 - 文本区域的背景颜色在悬停时不会改变

在 GUI 文本区域上添加和刷新文本?

Ruby on Rails 中文本区域的最大长度

如何使用文本区域?