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");
}
}
}
効果
さて、それは終わった、もっとエキサイティングな突っ込みを続ける↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓