|
楼主 |
发表于 2023-2-28 00:43:36
|
显示全部楼层
本帖最后由 shishu 于 2023-2-28 00:54 编辑
各位 暂时算临时解决了这个问题。
经过实验发现squareline的拖拽容器只有panel,可以在panel上面放图片和按钮。可以自己自定义组合各种控件,但是遗憾的panel控件就是基础控件lv_obj_t,它没有复杂的layout布局控制,内部默认的构建函数和回调函数里面没有对上下左右导航的处理,最后导致panel父容器不能通过方向键来导航到子控件上。但是如果把父控件里面的子控件一个个绑定到group,group和按键关联后可以通过pageup、down来导航放入到group里面的子控件。后来查看gourp和indev的源代码。发现group的代码里面实际上有左右上下导航的处理。但是条件比较苛刻,比如两个父控件panel添加到group,一个父控件设定为focus状态,这个时候通过方向键可以导航这个父控件下的子控件一次,但是导航到这个子控件后,父控件失去focus就无法导航第二个子控件,这里的一个过滤的地方就是group的父控件要获得焦点才能导航其下面的子控件,矛盾的地方就是子控件因为导航获得焦点后父控件失去焦点无法再导航。这里我修改了源码,源码只适用我自己的情况。就是往group里面只放置一个父控件。home界面的8个小图标都是在一个大的panel父控件里面,然后修改源码在group里面只有一个父控件的时候不论父控件有没有获得焦点直接传递event到后面。代码如下:
原代码:
lv_res_t lv_group_send_data(lv_group_t * group, uint32_t c)
{
lv_obj_t * act = NULL;
act = lv_group_get_focused(group);
if(act == NULL) return LV_RES_OK;
if(lv_obj_has_state(act, LV_STATE_DISABLED)) return LV_RES_OK;
return lv_event_send(act, LV_EVENT_KEY, &c);
}
被修改为:
lv_res_t lv_group_send_data(lv_group_t * group, uint32_t c)
{
lv_obj_t * act = NULL;
if(lv_group_get_obj_count(group)==1){
lv_obj_t ** obj_i;
obj_i = _lv_ll_get_head(&group->obj_ll);
if(*obj_i!=NULL)
act = *obj_i;
}else{
act = lv_group_get_focused(group);
}
if(act == NULL) return LV_RES_OK;
if(lv_obj_has_state(act, LV_STATE_DISABLED)) return LV_RES_OK;
return lv_event_send(act, LV_EVENT_KEY, &c);
}
这样最后一句lv_event_send(act, LV_EVENT_KEY, &c);都会执行,会把keycode传递给父控件上。
父控件设置回调函数。监控上下左右和enter的输入,自己在回调函数中手动的调整选择的子控件。
lv_group_send_data函数在lv_group.c lvgl版本是8.2 |
|