multobj控件

1. 使用场景

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

2. 功能介绍

2.1 接口说明

接口函数

功能说明

参数说明

lv_obj_t *lv_multobj_create(lv_obj_t *parent)

创建一个multobj对象,作为多对象管理的容器

parent:指向父对象的指针;返回值:创建成功的multobj对象指针

void lv_multobj_set_zoom(lv_obj_t *multobj, float zoom)

根据保存的对象层级结构对multobj内的对象进行缩放

multobj:指向multobj对象的指针;zoom:缩放因子(0≤zoom<1缩小,zoom=1不变,zoom>1放大)

void lv_multobj_reset_hier(lv_obj_t *multobj)

重置multobj子对象的层级结构和位置信息

multobj:指向multobj对象的指针

void lv_multobj_set_snapshot(lv_obj_t *multobj, bool is_enable)

启用/禁用multobj文本的快照功能

multobj:指向multobj对象的指针;is_enable:true启用快照,false禁用快照

void lv_multobj_set_label_pos_cb(lv_obj_t *multobj, lv_multobj_label_pos_cb callback)

注册标签位置自定义的回调函数,用于自文本的位置逻辑

multobj:指向multobj对象的指针;callback:标签位置回调函数指针(函数原型:void(*)(lv_obj_t *label, float zoom, lv_coord_t x, lv_coord_t y))

void lv_multobj_set_label_align(lv_obj_t *multobj, lv_label_align_type hor_align, lv_label_align_type ver_align)

设置multobj文本的默认对齐方式(水平+垂直)

multobj:指向multobj对象的指针;hor_align:水平对齐类型(LABEL_ALIGN_LEFT/CENTER/RIGHT);ver_align:垂直对齐类型(LABEL_ALIGN_UP/CENTER/DOWN)

3. 案例详解

3.1 multobj独立使用

static lv_coord_t zoom = 255;
static void app_event_cb(lv_event_t* e)
{
    lv_obj_t* obj = lv_event_get_current_target(e);
    lv_event_code_t code = lv_event_get_code(e);
    static lv_point_t point_pre = {0,0};
    if (code == LV_EVENT_PRESSED)
    {
        lv_indev_t* indev = lv_indev_get_act();
        lv_indev_get_point(indev,&point_pre);
        lv_multobj_set_zoom(obj,1);
        lv_obj_center(obj);
    }
    else if (code == LV_EVENT_PRESSING)
    {
        lv_point_t cur_point = {0,0};
        lv_indev_t* indev = lv_indev_get_act();
        lv_indev_get_point(indev, &cur_point);
        float vect = LV_ABS(cur_point.y - point_pre.y);
        float zoom = 1 - vect / LV_VER_RES_MAX;
        lv_multobj_set_zoom(obj, zoom);
        lv_obj_center(obj);
    }
}

static void on_start(void)
{
    lv_obj_t* bg = lv_multobj_create(lv_scr_act());
    lv_obj_remove_style_all(bg);
    lv_obj_set_size(bg, LV_PCT(100), LV_PCT(100));
    lv_obj_set_style_bg_color(bg, LV_COLOR_RED, 0);
    lv_obj_set_style_bg_opa(bg, LV_OPA_100, 0);
    lv_obj_add_flag(bg, LV_OBJ_FLAG_CLICKABLE);
    lv_obj_clear_flag(bg, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_add_event_cb(bg, app_event_cb, LV_EVENT_ALL, NULL);
    lv_obj_refr_size(bg);
    lv_multobj_set_label_align(bg, LABEL_ALIGN_CENTER, LABEL_ALIGN_CENTER);

    lv_obj_t* rect = lv_obj_create(bg);
    lv_obj_remove_style_all(rect);
    lv_obj_set_size(rect, 200, 200);
    lv_obj_set_style_bg_color(rect, LV_COLOR_WHITE, 0);
    lv_obj_set_style_bg_opa(rect, LV_OPA_100, 0);
    lv_obj_center(rect);

    lv_obj_t* img = lv_img_create(bg);
    lv_img_set_src(img, APP_GET_IMG(img_setting));
    lv_obj_align(img,LV_ALIGN_CENTER,120,0);

    lv_obj_t* img1 = lv_img_create(bg);
    lv_img_set_src(img1, APP_GET_IMG(img_setting));
    lv_obj_align(img1, LV_ALIGN_CENTER, -120, 0);

    lv_obj_t* label = lv_label_create(bg);
    lv_ext_set_local_font(label, FONT_TITLE, LV_COLOR_BLACK);
    lv_obj_set_width(label, LV_PCT(50));
    lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL);
    lv_label_set_text(label, "I am a scrolling string of English letters.");
    lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 20);
    

    //lv_obj_update_layout(lv_scr_act());
}

static void on_resume(void)
{

}

static void on_pause(void)
{

}

static void on_stop(void)
{

}

效果展示

fishy

3.1 配合multlist使用

在multlist的新建回调函数里,返回的element为multobj实例,multlist控件内部调用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\n", __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;
}

效果展示

fishy

4. 注意事项

  1. 由于obj的位置不能使能亚像素,导致在设置大小和移动位置的过程中有抖动。

  2. multobj里面的内容在redraw后如果要缩放,需要调用lv_multobj_reset_hier

  3. 拍照接口使能与置位只针对multobj子元素为文本控件是否拍照,否则文本缩放过程只能保持为来大小