view 的交互:
通过 VIEW_DEFINE 静态定义一个 view(包括 id,proc 以及其他属性)
VIEW_DEFINE(flashlight_view, _flashlight_view_handler, NULL, \
NULL, FLASHLIGHT_VIEW, NORMAL_ORDER, UI_VIEW_LVGL, DEF_UI_VIEW_WIDTH, DEF_UI_VIEW_HEIGHT);
通过 view_layout_update事件
先通过 res manager 加载 UI Editor 资源
static int _load_resource(flashlight_view_data_t *data, bool first_layout)
{
int32_t ret;
/* load scene */
if(first_layout)
{
ret = lvgl_res_load_scene(SCENE_FLASHLIGHT_VIEW, &data->res_scene, DEF_STY_FILE, DEF_RES_FILE, DEF_STR_FILE);
if (ret < 0) {
SYS_LOG_ERR("SCENE_FLASHLIGHT_VIEW not found");
return -ENOENT;
}
}
/* load resource */
lvgl_res_load_pictures_from_scene(&data->res_scene, _bmp_ids, data->img_dsc_bmp, data->pt_bmp, NUM_BMPS);
if(first_layout)
{
/* open font */
lvgl_res_load_strings_from_scene(&data->res_scene, _txt_ids, data->res_txt, NUM_TXTS);
/* convert resource */
}
SYS_LOG_INF("load resource succeed");
return 0;
}
资源加载完成后
调用 GUI 函数初始化整个界面的视图元素,例如 LVGL的
static int _flashlight_view_layout_update(view_data_t *view_data, bool first_layout)
{
lv_obj_t *scr = lv_disp_get_scr_act(view_data->display);
lv_obj_set_style_bg_color(scr, lv_color_make(0, 0, 0), LV_PART_MAIN);// + rgb(0, 0, 0)
lv_obj_set_style_bg_opa(scr, LV_OPA_COVER, LV_PART_MAIN);
flashlight_view_data_t *data = view_data->user_data;
if(first_layout)
{
data = app_mem_malloc(sizeof(*data));
if (!data) {
return -ENOMEM;
}
view_data->user_data = data;
memset(data, 0, sizeof(*data));
}
if (_load_resource(data, first_layout)) {
app_mem_free(data);
view_data->user_data = NULL;
return -ENOENT;
}
if(first_layout)
{
// 在这创建你的页面对象
data->switch1 = an_switch_create(scr, 202, 220, 0, NULL);
}
return 0;
}
通过 ui_view_paint 主动更新 view,通常用于需要主动更新 view 的 data,例如表盘需要定时更新时间。
// 在这里更新页面内容,请调用ui_view_paint(FLASHLIGHT_VIEW);
static int _flashlight_view_paint(view_data_t *view_data)
{
// 外部数据获取接口
// const flashlight_view_presenter_t *presenter = view_get_presenter(view_data);
flashlight_view_data_t *data = view_data->user_data;
if (data) {
SYS_LOG_INF("_flashlight_view_paint");
}
return 0;
}
通过 ui_view_delete,销毁 view。
static int _flashlight_view_delete(view_data_t *view_data)
{
flashlight_view_data_t *data = view_data->user_data;
int i;
if (data) {
_unload_resource(data);
lv_obj_t *scr = lv_disp_get_scr_act(view_data->display);
lv_obj_del(scr);
app_mem_free(data);
view_data->user_data = NULL;
} else {
lvgl_res_preload_cancel_scene(SCENE_FLASHLIGHT_VIEW);
}
lvgl_res_unload_scene_compact(SCENE_FLASHLIGHT_VIEW);
return 0;
}
注意:
由于所有 view 的绘制以及显示请求都是在同一个线程(UI Service 线程),所以
int _flashlight_view_handler(uint16_t view_id, uint8_t msg_id, void * msg_data)
{
view_data_t *view_data = msg_data;
switch (msg_id) {
case MSG_VIEW_PRELOAD:
return _flashlight_view_preload(view_data, false);
case MSG_VIEW_LAYOUT:
return _flashlight_view_layout(view_data);
case MSG_VIEW_DELETE:
return _flashlight_view_delete(view_data);
case MSG_VIEW_PAINT:
return _flashlight_view_paint(view_data);
case MSG_VIEW_FOCUS:
return _flashlight_view_focus_changed(view_data, true);
case MSG_VIEW_DEFOCUS:
return _flashlight_view_focus_changed(view_data, false);
case MSG_VIEW_UPDATE:
return _flashlight_view_updated(view_data);
default:
return 0;
}
return 0;
}
`回调不能有等待,以免 UI 卡死`