LVGL lv_btn 按钮(9)

lv_btn

lv_btn按钮其实是lv_cont的复杂变体,可以包含子对象,常见的子对象是lv_label标签,相关API在lv_btn.h,lv_btn有6种状态

/** Possible states of a button.
 * It can be used not only by buttons but other button-like objects too*/
enum {
    LV_BTN_STATE_RELEASED,
    LV_BTN_STATE_PRESSED,
    LV_BTN_STATE_DISABLED,
    LV_BTN_STATE_CHECKED_RELEASED,
    LV_BTN_STATE_CHECKED_PRESSED,
    LV_BTN_STATE_CHECKED_DISABLED,
    _LV_BTN_STATE_LAST, /* Number of states*/
};
typedef uint8_t lv_btn_state_t;
状态变化

非切换按钮

LV_BTN_STATE_RELEASED-->LV_BTN_STATE_PRESSED-->LV_BTN_STATE_RELEASED

切换按钮
第一次点击时

LV_BTN_STATE_CHECKED_RELEASED-->LV_BTN_STATE_CHECKED_PRESSED-->LV_BTN_STATE_RELEASED

第二次点击

LV_BTN_STATE_RELEASED-->LV_BTN_STATE_PRESSED-->LV_BTN_STATE_CHECKED_RELEASED

布局和自适应

因为本质是lv_cont,所以layout和fit类型和lv_cont一致

样式

/**Styles*/
enum {
    LV_BTN_PART_MAIN = LV_OBJ_PART_MAIN,
    _LV_BTN_PART_VIRTUAL_LAST,
    _LV_BTN_PART_REAL_LAST = _LV_OBJ_PART_REAL_LAST,
};
typedef uint8_t lv_btn_part_t;

例子

static void event_handler(lv_obj_t * obj, lv_event_t event)
{
    if(event == LV_EVENT_CLICKED) {
        printf("Clicked\n");
    }
    else if(event == LV_EVENT_VALUE_CHANGED) {
        printf("Toggled\n");
		
    }printf("%x,:%d\n", obj, lv_btn_get_state(obj));
}

void lv_ex_btn_1(void)
{
    lv_obj_t * label;

    lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL);/*创建btn1*/
    lv_obj_set_event_cb(btn1, event_handler);/*设置btn1回调函数*/
    lv_obj_align(btn1, NULL, LV_ALIGN_CENTER, 0, -40);

    label = lv_label_create(btn1, NULL);/*btn1内创建label*/
    lv_label_set_text(label, "Button");
	printf("%x,btn1:%d\n", btn1,lv_btn_get_state(btn1));

    lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), NULL);/*创建btn2*/
    lv_obj_set_event_cb(btn2, event_handler);/*设置btn2回调函数*/
    lv_obj_align(btn2, NULL, LV_ALIGN_CENTER, 0, 40);
    lv_btn_set_checkable(btn2, true);/*设置为toggle形按钮*/
    lv_btn_toggle(btn2);/*切换按钮状态*/
    lv_btn_set_fit2(btn2, LV_FIT_NONE, LV_FIT_TIGHT);/*设置按钮自适应模式*/

    label = lv_label_create(btn2, NULL);/*btn2内创建label*/
    lv_label_set_text(label, "Toggled");
	printf("%x,btn2:%d\n", btn2, lv_btn_get_state(btn2));
}

在这里插入图片描述

这段代码是一个基于 **LVGL** 图形库的 JavaScript 扩展函数,用于从列表组件 (`lv_obj_t`) 中获取当前处于聚焦状态(`LV_STATE_FOCUSED`)的按钮,并将其包装成一个可以返回给 JavaScript 环境的对象。 以下是逐步解析: --- ### 函数功能描述 1. **声明与入口** ```c DECLARE_HANDLER(getBtnSelected) ``` 这段代码通过宏 `DECLARE_HANDLER` 声明了一个名为 `getBtnSelected` 的处理函数。它可能是某个框架提供的机制,用于将 C/C++ 功能暴露到 JavaScript 引擎环境中运行。 2. **获取列表对象** ```c lv_obj_t *list = get_lvgl_from_jsclass_obj(ctx, this_value, js_list_class_id); ``` - 调用了 `get_lvgl_from_jsclass_obj()` 函数。 - 参数解释: - `ctx`: 当前上下文环境。 - `this_value`: 表示当前调用者的实例。 - `js_list_class_id`: 指定这是一个 List 类型的绑定标识符。 - 目标是从 JavaScript 对象中提取出对应的 LVGL 列表控件(`lv_obj_t* list`),这是后续操作的核心数据结构。 3. **遍历子元素** ```c int chlid_cnt = lv_obj_get_child_cnt(list); // 获取所有子节点的数量 for (int i = 0; i < chlid_cnt; i++) { // 遍历每个子节点 lv_obj_t *tmp_btn = lv_obj_get_child(list, i); // 取第i个子对象 if (tmp_btn && lv_obj_has_state(tmp_btn, LV_STATE_FOCUSED)) { btn = tmp_btn; break; // 如果找到已选中的按钮,则停止搜索 } } ``` - 使用了 `lv_obj_get_child_cnt()` 和 `lv_obj_get_child()` 来逐一遍历列表的所有子项。 - 检查每一个子对象是否处于“聚焦”状态(`LV_STATE_FOCUSED`)。如果找到了满足条件的第一个按钮,就记录下来并退出循环。 4. **封装结果** ```c if (btn) { return wrap_lvgl_to_jsclass_obj(ctx, btn, get_js_button_class()); } ``` - 如果成功找到了符合条件的按钮(`btn != NULL`),则使用 `wrap_lvgl_to_jsclass_obj()` 将其转换为可以在 JavaScript 中使用的对象形式。 - 最终返回该对象至调用者。 5. **默认值** ```c return JS_NULL; ``` - 如果未找到任何匹配的按钮,直接返回空指针(`JS_NULL`),表示没有选择的项目。 --- ### 总结作用 此函数的作用是从一个 LVGL 的列表控件中查找当前获得焦点的那个按钮,并将其作为可交互的 JavaScript 对象返回。如果没有合适的选项被选中,则返回空值。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值