点击、滑动、输入、数字改变等等都可触发事件。事件就是针对不同的操作做出相对应的反应。
最近看到组态屏,这玩意开发起来好像挺简单的!!哈哈哈!!研究完LVGL的事件就看看这个。
本篇文章,主要是想了解滑块、下拉列表、键盘等这些部件的事件。
本篇文章主要是依托于官网给出的例子,分析其应用的 API 。
如果有些介绍补全,后续会继续更新添加的!目前只是能用就可。
看一个官网提供的例子:
- static void event_cb(lv_event_t * e)
- {
- lv_event_code_t code = lv_event_get_code(e); // 获取当前部件(对象)触发的事件代码
- lv_obj_t * label = lv_event_get_user_data(e); // 读取到标签对象
-
- switch(code) {
- case LV_EVENT_PRESSED: // 按下
- lv_label_set_text(label, "The last button event:\nLV_EVENT_PRESSED");
- break;
- case LV_EVENT_CLICKED: // 按下且松开
- lv_label_set_text(label, "The last button event:\nLV_EVENT_CLICKED");
- break;
- case LV_EVENT_LONG_PRESSED: // 按下指定多少时间
- lv_label_set_text(label, "The last button event:\nLV_EVENT_LONG_PRESSED");
- break;
- case LV_EVENT_LONG_PRESSED_REPEAT: // 类似上面但又不同
- lv_label_set_text(label, "The last button event:\nLV_EVENT_LONG_PRESSED_REPEAT");
- break;
- default:
- break;
- }
- }
-
-
- void lv_example_event_2(void)
- {
- lv_obj_t * btn = lv_btn_create(lv_scr_act()); // 创建按钮对象
- lv_obj_set_size(btn, 100, 50);
- lv_obj_center(btn);
-
- lv_obj_t * btn_label = lv_label_create(btn); // 创建标签
- lv_label_set_text(btn_label, "Click me!");
- lv_obj_center(btn_label);
-
- lv_obj_t * info_label = lv_label_create(lv_scr_act()); //创建标签
- lv_label_set_text(info_label, "The last button event:\nNone");
-
- lv_obj_add_event_cb(btn, event_cb, LV_EVENT_ALL, info_label); // btn的事件,并传入标签对象
- }
不同的显示状况:



这个百分值问题,就用上了 事件
- static void value_changed_event_cb(lv_event_t * e);
-
- void lv_example_arc_1(void)
- {
- lv_obj_t * label = lv_label_create(lv_scr_act());
-
- /*Create an Arc*/
- lv_obj_t * arc = lv_arc_create(lv_scr_act());
- lv_obj_set_size(arc, 150, 150);
- lv_arc_set_rotation(arc, 135);
- lv_arc_set_bg_angles(arc, 0, 270);
- lv_arc_set_value(arc, 10);
- lv_obj_center(arc);
-
- /* 创建事件,值被更改时触发事件 */
- lv_obj_add_event_cb(arc, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, label);
-
- /*Manually update the label for the first time*/
- lv_event_send(arc, LV_EVENT_VALUE_CHANGED, NULL);
- }
-
- static void value_changed_event_cb(lv_event_t * e)
- {
- lv_obj_t * arc = lv_event_get_target(e); // 获取触发事件的部件(对象)
- lv_obj_t * label = lv_event_get_user_data(e); // 得到label标签对象
-
- lv_label_set_text_fmt(label, "%d%%", lv_arc_get_value(arc)); // 设置label的值
-
- /*Rotate the label to the current position of the arc*/
- /* 将对象label固定在圆弧当前位置上 */
- lv_arc_rotate_obj_to_angle(arc, label, 25);
- }
这里的事件函数中用到了一个函数:通过此函数可设置音量、亮度等等值!!
直接用个全局变量就能改其他的东西了!!!
- /* 获取圆弧的值
- * @ obj:指向弧对象的指针
- * return:圆弧的值
- */
- int16_t lv_arc_get_value ( const lv_obj_t * obj )

看一个两端都能控制的滑块,这样就单个划的话也能够学会!
- static void slider_event_cb(lv_event_t * e);
-
- void lv_example_slider_3(void)
- {
- /*Create a slider in the center of the display*/
- lv_obj_t * slider;
- slider = lv_slider_create(lv_scr_act());
- lv_obj_center(slider);
-
- lv_slider_set_mode(slider, LV_SLIDER_MODE_RANGE); // 模式设置
- lv_slider_set_value(slider, 70, LV_ANIM_OFF); // 右边界
- lv_slider_set_left_value(slider, 20, LV_ANIM_OFF); // 左边界
-
- /* 创建事件,任何动作可触发 */
- lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_ALL, NULL);
- lv_obj_refresh_ext_draw_size(slider); // 刷新绘图大小
- }
-
- static void slider_event_cb(lv_event_t * e)
- {
- lv_event_code_t code = lv_event_get_code(e); // 获取当前部件(对象)触发的事件代码
- lv_obj_t * obj = lv_event_get_target(e); // 获取触发事件的部件(对象)
-
- /*Provide some extra space for the value*/
- if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { // 获取对象周围所需的额外绘制区域
- lv_event_set_ext_draw_size(e, 50);
- }
- else if(code == LV_EVENT_DRAW_PART_END) { // 完成绘制部分
- lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);
- if(dsc->part == LV_PART_INDICATOR) { // 指标
- char buf[16];
- lv_snprintf(buf, sizeof(buf), "%d - %d", (int)lv_slider_get_left_value(obj), (int)lv_slider_get_value(obj));
-
- lv_point_t label_size; // 尺寸结构体
- lv_txt_get_size(&label_size, buf, LV_FONT_DEFAULT, 0, 0, LV_COORD_MAX, 0);
- lv_area_t label_area; // 位置结构体
- label_area.x1 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2 - label_size.x / 2;
- label_area.x2 = label_area.x1 + label_size.x;
- label_area.y2 = dsc->draw_area->y1 - 10;
- label_area.y1 = label_area.y2 - label_size.y;
-
- lv_draw_label_dsc_t label_draw_dsc;
- lv_draw_label_dsc_init(&label_draw_dsc);
- label_draw_dsc.color = lv_color_hex3(0x888);
- lv_draw_label(dsc->draw_ctx, &label_draw_dsc, &label_area, buf, NULL);
- }
- }
- }
和圆弧类似的API
- /* 获取主旋钮的值
- * @ obj:指向滑块的指针
- * return:滑块主旋钮的值
- */
- static inline int32_t lv_slider_get_value(const lv_obj_t *obj)

-
- static void event_handler(lv_event_t * e)
- {
- lv_event_code_t code = lv_event_get_code(e);
- lv_obj_t * obj = lv_event_get_target(e);
- if(code == LV_EVENT_VALUE_CHANGED) { // 当复选框备切换时
- const char * txt = lv_checkbox_get_text(obj); // 获取复选框的文本
- const char * state = lv_obj_get_state(obj) & LV_STATE_CHECKED ? "Checked" : "Unchecked";
- LV_LOG_USER("%s: %s", txt, state);
- }
- }
-
- void lv_example_checkbox_1(void)
- {
- lv_obj_set_flex_flow(lv_scr_act(), LV_FLEX_FLOW_COLUMN);
- lv_obj_set_flex_align(lv_scr_act(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER);
-
- lv_obj_t * cb;
- cb = lv_checkbox_create(lv_scr_act());
- lv_checkbox_set_text(cb, "Apple");
- lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);
-
- cb = lv_checkbox_create(lv_scr_act());
- lv_checkbox_set_text(cb, "Banana");
- lv_obj_add_state(cb, LV_STATE_CHECKED);
- lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);
-
- cb = lv_checkbox_create(lv_scr_act());
- lv_checkbox_set_text(cb, "Lemon");
- lv_obj_add_state(cb, LV_STATE_DISABLED);
- lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);
-
- cb = lv_checkbox_create(lv_scr_act());
- lv_obj_add_state(cb, LV_STATE_CHECKED | LV_STATE_DISABLED);
- lv_checkbox_set_text(cb, "Melon\nand a new line");
- lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);
-
- lv_obj_update_layout(cb);
- }
用到的API
- /* 获取复选框的文本
- * @ obj:指向复选框对象的指针
- * return:指向复选框文本的指针
- */
- const char * lv_checkbox_get_text ( const lv_obj_t * obj )
- /* 获取对象的状态
- * @ obj:指向对象的指针
- * return:状态(lv_state_t)
- */
- lv_state_t lv_obj_get_state ( const lv_obj_t * obj )

- static void event_handler(lv_event_t * e)
- {
- lv_event_code_t code = lv_event_get_code(e);
- lv_obj_t * obj = lv_event_get_target(e);
- if(code == LV_EVENT_VALUE_CHANGED) { // 对象的值被更改
- char buf[32];
- lv_dropdown_get_selected_str(obj, buf, sizeof(buf));
- LV_LOG_USER("Option: %s", buf);
- }
- }
-
- void lv_example_dropdown_1(void)
- {
-
- /*Create a normal drop down list*/
- lv_obj_t * dd = lv_dropdown_create(lv_scr_act());
- lv_dropdown_set_options(dd, "Apple\n"
- "Banana\n"
- "Orange\n"
- "Cherry\n"
- "Grape\n"
- "Raspberry\n"
- "Melon\n"
- "Orange\n"
- "Lemon\n"
- "Nuts");
-
- lv_obj_align(dd, LV_ALIGN_TOP_MID, 0, 20); // 对齐
- lv_obj_add_event_cb(dd, event_handler, LV_EVENT_ALL, NULL); // 事件
- }
用到的 API
- /* 以字符串形式获取当前选定的选项
- * @ obj:指向下拉对象的指针
- * @ buf:指向存储字符串的数组的指针
- * @ buf_size:buf大小以字节为单位
- */
- void lv_dropdown_get_selected_str ( const lv_obj_t * obj , char * buf , uint32_t buf_size )