multobj控件

一、使用场景

  对于multlis使能贝塞尔变形需要缩放的场景,在没有拍照的情况下实现缩放只能通过调整大小以及位置实现缩放。

二、功能介绍

1. 文本拍照缩放

  由于文本设置大小不能实现无极缩放,所以需对文本拍照后才能缩放。

void lv_multobj_set_snapshot(lv_obj_t *multobj, bool is_enable);

  对于内存不足的情况,可以不使能拍摄,通过文本的对齐。

//1、自定义文本位置回调函数
void lv_multobj_set_label_pos_cb(lv_obj_t *multobj, lv_multobj_label_pos_cb callback);
//2、设置文本对齐方式,在不使能拍照的情况下,默认对齐方式为居中对齐
void lv_multobj_set_label_align(lv_obj_t *multobj, lv_label_align_type hor_align, lv_label_align_type ver_align);

三、案例详解

1. 控件使用说明

  在multlist的新建回调函数里,返回的element为multobj实例。初始化是使能贝塞尔变形

//1.删除回调流程
lv_obj_t *mainmenu_list_new_item_cb(lv_obj_t *parent, lv_multlist_item_t *item)
{
    builtin_app_desc_t *builtin_app = (builtin_app_desc_t *)item->info;
    char *txt = NULL;
    const void *img = NULL;
    mainmenu_ext_icons_t *table_elem = NULL;
#if defined(APP_DLMODULE_APP_USED)
    if (builtin_app && true == dynamic_app_check_thumb_valid(builtin_app->icon))
    {
        img = builtin_app->icon;
        txt = (char *)builtin_app->name;
        rt_kprintf("%s:dynamic title %s

", __func__, txt);
    }
#endif
    if (!txt)
    {
#if defined(APP_MENU_EXT_USED)
        table_elem = (mainmenu_ext_icons_t *)item->user_data;
        RT_ASSERT(builtin_app || table_elem);
        img = (builtin_app) ? (lv_img_dsc_t *)builtin_app->icon : table_elem->img_src;
        txt = (builtin_app) ? (char *)app_get_str_from_id(builtin_app->name) : (char *)app_get_str_from_id(table_elem->txt);
#else
        img = builtin_app->icon;
        txt = (char *)app_get_str_from_id(builtin_app->name);
#endif
    }
    lv_obj_t *item_btn = lv_multobj_create(parent);
    lv_obj_remove_style_all(item_btn);
    lv_obj_set_size(item_btn, item->org_w, item->org_h);
    lv_obj_set_style_bg_color(item_btn, LV_COLOR_BLACK, LV_STATE_DEFAULT);
    lv_obj_set_style_bg_opa(item_btn, LV_OPA_100, LV_STATE_DEFAULT);
    lv_obj_add_flag(item_btn, LV_OBJ_FLAG_PRESS_LOCK | LV_OBJ_FLAG_EVENT_BUBBLE);
    lv_obj_clear_flag(item_btn, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_pos(item_btn, LV_HOR_RES_MAX, LV_VER_RES_MAX);
    lv_obj_refr_size(item_btn);

    lv_obj_t *item_bg = lv_obj_create(item_btn);
    lv_obj_remove_style_all(item_bg);
    lv_obj_set_size(item_bg, item->org_w, item->org_h);
    lv_obj_set_style_radius(item_bg, 20, LV_STATE_DEFAULT);
    lv_obj_set_style_border_width(item_bg, 0, LV_STATE_DEFAULT);
    lv_obj_set_style_bg_color(item_bg, lv_color_make(0x55, 0x55, 0x55), LV_STATE_DEFAULT);
    lv_obj_set_style_bg_opa(item_bg, LV_OPA_100, LV_STATE_DEFAULT);
    lv_obj_add_flag(item_bg, LV_OBJ_FLAG_PRESS_LOCK | LV_OBJ_FLAG_EVENT_BUBBLE);
    lv_obj_clear_flag(item_bg, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_refr_size(item_bg);

    lv_obj_t *bg_icons = lv_img_create(item_btn);
    lv_img_set_src(bg_icons, img);
    lv_obj_refr_size(bg_icons);
    lv_obj_align(bg_icons, LV_ALIGN_LEFT_MID,  30, 0);
    lv_obj_refr_pos(bg_icons);

    lv_obj_t *name = lv_label_create(item_btn);
    lv_ext_set_local_font(name, FONT_TITLE, LV_COLOR_WHITE);
    lv_label_set_text(name, txt);
    lv_obj_refr_size(name);
    lv_obj_align(name, LV_ALIGN_LEFT_MID, 150, 0);
    lv_obj_refr_pos(name);
    lv_obj_add_flag(name, LV_OBJ_FLAG_EVENT_BUBBLE);

    if (builtin_app)
    {
        lv_obj_add_event_cb(item_btn, app_menu_list_call_back, LV_EVENT_SHORT_CLICKED, item->info);
    }
#if defined(APP_MENU_EXT_USED)
    else if (table_elem)
    {
        lv_obj_add_event_cb(item_btn, icon_cilck_cb, LV_EVENT_SHORT_CLICKED, item->user_data);
    }
#endif
    //lv_obj_refr_pos(item_btn);
    return item_btn;
}

四、注意事项

  1.由于obj的位置不能使能亚像素,导致在设置大小和移动位置的过程中有抖动。   2.multobj里面的内容在redraw后如果要缩放,需要调用lv_multobj_reset_hier