当前位置:网站首页>【LVGL事件(Events)】事件在不同组件上的应用(一)
【LVGL事件(Events)】事件在不同组件上的应用(一)
2022-07-28 12:52:00 【喜暖知寒】
点击、滑动、输入、数字改变等等都可触发事件。事件就是针对不同的操作做出相对应的反应。
最近看到组态屏,这玩意开发起来好像挺简单的!!哈哈哈!!研究完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 ) 边栏推荐
- Some thoughts on.Net desktop development
- Algorithm --- different paths (kotlin)
- Graph traversal (BFS & DFS basis)
- 记一次使用pdfbox解析pdf,获取pdf的关键数据的工具使用
- Tutorial on the principle and application of database system (060) -- MySQL exercise: operation questions 11-20 (IV)
- Can second uncle cure young people's spiritual internal friction?
- 长封闭期私募产品再现 业内人士看法各异
- C language: merge sort
- PHP generates random numbers (nickname random generator)
- DOJP1520星门跳跃题解
猜你喜欢

Cool operation preheating! Code to achieve small planet effect

How to check if the interface cannot be adjusted? I didn't expect that the old bird of the 10-year test was planted on this interview question

I'm bald! Who should I choose for unique index or general index?

The domestic API management tool eolink is very easy to use, creating an efficient research and development tool

Deploy application delivery services in kubernetes (Part 1)

SLAM论文合集

DXF读写:对齐尺寸标注文字居中、上方的位置计算

Volcanic stone investment Zhang Suyang: hard technology, the relatively certain answer in the next 10 years

Half wave rectification light LED

安全保障基于软件全生命周期-NetworkPolicy应用
随机推荐
Algorithm --- different paths (kotlin)
【飞控开发基础教程7】疯壳·开源编队无人机-SPI(气压计数据获取)
111. SAP UI5 FileUploader 控件实现本地文件上传,接收服务器端的响应时遇到跨域访问错误
Volcanic stone investment Zhang Suyang: hard technology, the relatively certain answer in the next 10 years
R语言ggplot2可视化:使用ggpubr包的ggviolin函数可视化小提琴图、设置draw_quantiles参数添加指定分位数横线(例如,50%分位数、中位数)
Debezium series: major changes and new features of 2.0.0.beta1
安全保障基于软件全生命周期-NetworkPolicy应用
30 day question brushing plan (IV)
盘点操作URL中常用的几个高效API
R language ggplot2 visualization: visualize the scatter diagram and add text labels to the data points in the scatter diagram, using geom of ggrep package_ text_ The rep function avoids overlapping da
Force buckle 2354. Number of high-quality pairs
Dojnoip201708 cheese solution
30天刷题计划(三)
R语言使用lm函数构建线性回归模型、使用subset函数指定对于数据集的子集构建回归模型(使用floor函数和length函数选择数据前部分构建回归模型)
leetcode(442)数组中重复的数据
Rust from introduction to mastery 01 introduction
安全保障基于软件全生命周期-Istio的认证机制
C language: random generated number + merge sort
Is azvudine, a domestic oral new coronal drug, safe? Expert authority interpretation
111. The sap ui5 fileuploader control realizes local file upload and encounters a cross domain access error when receiving the response from the server