網(wǎng)站建設(shè)報價單表格深圳網(wǎng)站seo推廣
按鈕基礎(chǔ)使用方法:
lv_btn 和 lb_obj 使用方法一樣,只是外表并不相同,基礎(chǔ)創(chuàng)建方法只需一行代碼。
lv_obj_t* btn = lv_btn_create(lv_scr_act());
添加大小和位置:?
lv_obj_t* btn = lv_btn_create(lv_scr_act());
lv_obj_set_size(btn, 100, 50);
lv_obj_set_align(btn, LV_ALIGN_CENTER);
添加觸發(fā)樣式:?
在 lv_obj_set_style_bg_color() 配置為,LV_STATE_PRESSED 即可配置為按下改變顏色。
其中和 lv_obj 一樣,共有以下可供選擇的參數(shù):
lv_obj_t* btn = lv_btn_create(lv_scr_act());
lv_obj_set_size(btn, 100, 50);
lv_obj_set_align(btn, LV_ALIGN_CENTER);
lv_obj_set_style_bg_color(btn, lv_color_hex(0xffe1d4), LV_STATE_PRESSED);
添加事件:
lv_obj_add_event_cb(); 可以添加事件。
static void event_cb(lv_event_cb_t* e) {lv_event_code_t code = lv_event_get_code(e);if (code == LV_EVENT_VALUE_CHANGED) {printf("LV_EVENT_VALUE_CHANGED\n");}
}void my_gui(void){lv_obj_t* btn = lv_btn_create(lv_scr_act());lv_obj_add_flag(btn, LV_OBJ_FLAG_CHECKABLE);lv_obj_add_event_cb(btn, event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}
開關(guān)基礎(chǔ)使用方法:
lv_obj_t* switch1 = lv_switch_create(lv_scr_act());
為開關(guān)部件配置顏色:
開關(guān)部件共有三個部分可以單獨配置顏色,主體是指未被選中狀態(tài)(下圖中灰色),手柄指的是圓球部分,指示器則是選中部分(下圖中藍(lán)色)。
lv_obj_t* switch1 = lv_switch_create(lv_scr_act());lv_obj_set_style_bg_color(switch1, lv_color_hex(0xea1b1b), LV_PART_MAIN);lv_obj_set_pos(switch1, 0, 0);lv_obj_t* switch2 = lv_switch_create(lv_scr_act());lv_obj_set_style_bg_color(switch2, lv_color_hex(0xea1b1b),LV_PART_KNOB);lv_obj_set_pos(switch2, 0, 50);lv_obj_t* switch3 = lv_switch_create(lv_scr_act());lv_obj_set_style_bg_color(switch3, lv_color_hex(0xea1b1b), LV_STATE_CHECKED|LV_PART_INDICATOR);lv_obj_set_pos(switch3, 0, 100);
?
?值得注意的是,在設(shè)置?LV_PART_INDICATOR 指示器時,完整的寫法應(yīng)與上?LV_STATE_CHECKED,不然配置的樣式就會被覆蓋,導(dǎo)致不生效。
lv_obj_set_style_bg_color(switch3, lv_color_hex(0xea1b1b), LV_STATE_CHECKED|LV_PART_INDICATOR);
修改開關(guān)狀態(tài):
按鈕狀態(tài)默認(rèn)是關(guān)閉的,如果我們使用?lv_obj_add_state() 函數(shù)即可為按鈕添加一個選中的狀態(tài),這樣他在第一次運行時就是打開狀態(tài)。
lv_obj_t* switch1 = lv_switch_create(lv_scr_act());
lv_obj_set_pos(switch1, 0, 0);lv_obj_t* switch2 = lv_switch_create(lv_scr_act());
lv_obj_add_state(switch2, LV_STATE_CHECKED);
lv_obj_set_pos(switch2, 0, 50);
?如果要讓按鈕不被選中,我們可以再移除這個狀態(tài):lv_obj_clear_state() 即可做到
lv_obj_clear_state(switch2, LV_STATE_CHECKED);
?除了修改?LV_STATE_CHECKED 狀態(tài)外,另一個?LV_STATE_DISABLED 狀態(tài)也經(jīng)常使用,他的作用的使得按鈕不能被修改。
捕捉按鈕狀態(tài):
lv_obj_has_state()?函數(shù)可以返回當(dāng)前組件的狀態(tài)。在以下代碼中,我們使用了:
lv_obj_has_state(switch1, LV_STATE_CHECKED)
來返回選中狀態(tài)。其原理是檢查?LV_STATE_CHECKED 的狀態(tài)判斷的。
static void event_cb(lv_event_t* e) {lv_event_code_t code = lv_event_get_code(e);if (lv_obj_has_state(switch1, LV_STATE_CHECKED)) {printf("LED ON \n");}else {printf("LED OFF \n");}
}void my_gui(void) {switch1 = lv_switch_create(lv_scr_act());lv_obj_add_event_cb(switch1, event_cb, LV_EVENT_VALUE_CHANGED, NULL); //對象的值改變即觸發(fā)回調(diào)
}
效果如下:?
互斥鎖案例:
static void event_cb(lv_event_t* e) {lv_obj_t* target = lv_event_get_target(e); //獲得觸發(fā)的基本對象if (target == switch1) {if (lv_obj_has_state(switch1, LV_STATE_CHECKED)) lv_obj_clear_state(switch2, LV_STATE_CHECKED);else lv_obj_add_state(switch2, LV_STATE_CHECKED);}if (target == switch2) {if (lv_obj_has_state(switch2, LV_STATE_CHECKED)) lv_obj_clear_state(switch1, LV_STATE_CHECKED);else lv_obj_add_state(switch1, LV_STATE_CHECKED);}
}void my_gui(void) {switch1 = lv_switch_create(lv_scr_act());lv_obj_add_event_cb(switch1, event_cb, LV_EVENT_VALUE_CHANGED, NULL);switch2 = lv_switch_create(lv_scr_act());lv_obj_add_state(switch2, LV_STATE_CHECKED);lv_obj_set_pos(switch2, 0, 50);lv_obj_add_event_cb(switch2, event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}
?原理是當(dāng)設(shè)置了一個按鈕之后,就對另一個按鈕通過配置?lv_obj_add_state() 和?lv_obj_clear_state() 做出與之相反的動作。
?