組み込みGUILVGL「テキストエリアテキストエリアコントロール」の紹介

1.LVGLGUIテキスト領域制御の概念

テキスト領域は、ラベルとカーソルのあるページです。テキストや文字を追加することができます。長い行は折り返され、テキストが十分に長い場合は、テキスト領域をスクロールできます。

2.LVGLGUIテキスト領域のウィジェットとスタイル

テキスト領域はページセクションと同じです。LV_PAGE_PART_SCRLを使用する場合を除きます。これは、参照できず、常に透過的であるためです。このページの詳細なドキュメントを参照してください。

ページ部分に加えて、カーソルを描画するための仮想LV_TEXTAREA_PART_CURSOR部分が存在します。カーソルの領域は、常に現在の文字のバウンディングボックスです。ブロックカーソルは、LV_TEXTAREA_PART_CURSORのスタイルで背景色と背景opaを追加することで作成できます。create line cursorを使用すると、カーソルを透明にして、border_sideプロパティを設定できます。

3.LVGLGUIテキストエリアコントロールの使用

1.テキストを追加します

この関数を使用して文字を追加しますlv_textarea_add_char(textarea、'c')

この関数を使用して文字列を追加しますlv_textarea_add_text(textarea、 "このテキストを挿入")

この関数を使用して、テキスト領域全体の値を変更しますlv_textarea_set_text(ta、 "New text")

2.プレースホルダー

この関数を使用してプレースホルダーを設定しますlv_textarea_set_placeholder_text(ta、 "プレースホルダーテキスト")

3.文字を削除します

Backspack関数と同様に、この関数lv_textarea_del_char(textarea)を使用して左側の文字を削除します。

削除関数と同様に、この関数lv_textarea_del_char_forward(textarea)を使用して右側の文字を削除します。

4.カーソルを移動します

この関数でカーソル位置を設定しますlv_textarea_set_cursor_pos(textarea、10)、2番目のパラメーター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.カーソルを非表示にします

この関数でカーソルを非表示にしますlv_textarea_set_cursor_hidden(textarea、true)

6.カーソルの点滅時間

この関数を使用してカーソルの点滅時間を設定しますlv_textarea_set_cursor_blink_time(textarea、time_ms)

7.1ラインモード

テキスト領域は、1行のlv_textarea_set_one_line(ta、true)として構成できます。このモードでは、高さは1行のみを表示するように自動的に設定され、改行は無視され、改行は無効になります。

8.パスワードモード

テキストエリアはパスワードモードをサポートしています。パスワードモードは、lv_textarea_set_pwd_mode(textarea、true)で有効にできます。

•(箇条書き、U + 2022)文字がフォントに含まれている場合、入力された文字は、一定期間後、または新しい文字が入力されたときに変換されます。•が存在しない場合は、*を使用します。

パスワードモードでは、lv_textarea_get_text(textarea)は、箇条書きではなく実際のテキストを提供します。

表示時間は、lv_textarea_set_pwd_show_time(textarea、time_ms)で調整できます。

9.テキストの整列

この関数を使用してテキストの配置を設定しますlv_textarea_set_text_align(textarea、LV_LABEL_ALIGN_LET / CENTER / RIGHT)

10.受け入れられる文字

lv_textarae_set_accepted_chars(ta、 "0123456789。+-")を使用して、受け入れられる文字のリストを設定できます。他の文字は無視されます。

11.最大テキスト長

この関数を使用して最大テキスト長を設定しますlv_textarea_set_max_length(textarea、max_char_num)

12.非常に長いテキスト

テキスト領域に非常に長いテキストがある場合(たとえば、2万文字を超える場合)、スクロールと描画が遅くなる可能性があります。ただし、lv_conf.hでLV_LABEL_LONG_TXT_HINT 1を有効にすることで、大幅に改善できます。ラベルに関する情報を保存して、描画を高速化します。LV_LABEL_LONG_TXT_HINTを使用すると、スクロールと描画は「通常の」短いテキストと同じくらい高速になります。

13.テキストを選択します

lv_textarea_set_text_sel(textarea、true)が有効になっている場合は、部分的なテキストを選択できます。これは、マウスを使用してコンピューター上のテキストを選択するのと同じように機能します。

14.スクロールバー

スクロールバーは、lv_textarea_set_scrollbar_mode(textarea、lv_scrbar_mode_…)によって設定されたさまざまな戦略に従って表示できます。詳細については、Pageオブジェクトをご覧ください。

15.スクロールの伝播

別のスクロール可能なオブジェクト(ページなど)でテキスト領域をスクロールすると、スクロールがテキスト領域の端に到達し、スクロールが親オブジェクトに伝播される可能性があります。つまり、テキスト領域をさらにスクロールできる場合は、親領域がスクロールされます。

lv_ta_set_scroll_propagation(ta、true)で有効にできます。

16.エッジフラッシュ

テキスト領域を端までスクロールするときに、lv_ta_set_edge_flash(ta、true)を有効にすると、フラッシュアニメーションのような円を表示できます。

17.イベント

基本時間に加えて、以下の特別イベントがあります

  • LV_EVENT_INSERT 文字またはテキストが挿入される前に送信されます。イベントデータは、挿入する予定のテキストです。 lv_ta_set_insert_replace(ta, "New text") 挿入するテキストを置き換えます。新しいテキストは、イベントコールバックが存在するときに破棄されるローカル変数に含めることはできません。 "" 何も挿入しないことを意味します。

  • LV_EVENT_VALUE_CHANGED テキスト領域の内容が変更されたとき。

  • LV_EVENT_APPLYLV_KEY_ENTER が1行モードのテキスト領域に送信されたとき。

テキストエリアスペースの例を1つずつ示すのではなく、いくつかの包括的な例を見てみましょう。

例1:

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);
}

例1の効果:

例2

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");
        }
    }
}

効果

さて、それは終わった、もっとエキサイティングな突っ込みを続ける↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

おすすめ

転載: blog.csdn.net/XiaoXiaoPengBo/article/details/114082931