LVGL V 8.2.0 lv_roller

这份滚轮代码在lvgl v8.0.0被验证是正常工作的,
这份滚轮代码切换到v8.2.0时显示异常(LV_PART_SELECTED区域显示值不对,滑动是变化过快)

    static const char options_0_23[] = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23";
    static const char options_0_59[] = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59";
    
    lv_obj_t *roller = lv_roller_create(lv_scr_act());
    lv_obj_set_width(roller, width);
    lv_obj_set_style_bg_opa(roller, LV_OPA_0, 0);
    lv_obj_set_style_bg_opa(roller, LV_OPA_0, LV_PART_SELECTED);
    lv_obj_set_style_text_font(roller, &lv_font_montserrat_22, 0);
    lv_obj_set_style_text_font(roller, &lv_font_montserrat_28, LV_PART_SELECTED);
    lv_obj_set_style_text_font(roller, lv_palette_main(LV_PALETTE_BLUE), 0);
    lv_obj_set_style_text_font(roller, lv_palette_main(LV_PALETTE_RED), LV_PART_SELECTED);
    lv_obj_set_style_text_align(roller, LV_TEXT_ALIGN_CENTER, 0);
    ///* 滚动模式显示异常 */LV_ROLLER_MODE_INFINITE);//
    lv_roller_set_options(roller, options_0_59, LV_ROLLER_MODE_NORMAL);
    lv_roller_set_visible_row_count(roller, vis_row);
    lv_obj_align(roller, LV_ALIGN_CENTER, 0, 0);

初步发现的现象是lv_roller_set_options的options参数对长度敏感,修改成options_0_23有效,options_0_59异常

请问大概是什么情况可以让LV_ROLLER_MODE_INFINITE被启用

在lvgl v8.2.0中,对lv_roller的处理方式有所变化,具体而言,这里使用的lv_roller_set_options函数在v8.2.0中被废弃了,取而代之的是使用lv_roller_set_action函数,通过回调函数来实现选项的填充。

static void roller_action(lv_obj_t * roller, const char *txt)
{
    lv_roller_set_selected(roller, 0, LV_ANIM_OFF);

    lv_roller_set_options(roller, txt, LV_ROLLER_MODE_INIFITE);
}

void roller_create(lv_obj_t *par, int16_t width, int16_t vis_row)
{
    lv_obj_t *roller = lv_roller_create(par);
    lv_obj_set_width(roller, width);
    lv_obj_set_style_bg_opa(roller, LV_OPA_0, LV_PART_SELECTED);
    lv_obj_set_style_text_font(roller, &lv_font_montserrat_22, 0);
    lv_obj_set_style_text_font(roller, &lv_font_montserrat_28, LV_PART_SELECTED);
    lv_obj_set_style_text_font(roller, lv_palette_main(LV_PALETTE_BLUE), 0);
    lv_obj_set_style_text_font(roller, lv_palette_main(LV_PALETTE_RED), LV_PART_SELECTED);
    lv_obj_set_style_text_align(roller, LV_TEXT_ALIGN_CENTER, 0);
    lv_roller_set_selected(roller, 0, LV_ANIM_OFF);
    lv_roller_set_visible_row_count(roller, vis_row);
    lv_roller_set_action(roller, roller_action);
    lv_obj_align(roller, LV_ALIGN_CENTER, 0, 0);
}


其中,lv_roller_set_action函数用于设置回调函数,当用户在滚轮上滚动时,将会调用此函数。在本例中,我们通过回调函数roller_action来填充选项。在此回调函数中,我们使用lv_roller_set_options函数来设置选项,并将滚轮模式设置为LV_ROLLER_MODE_INIFITE,从而实现无限循环滚动的效果。同时,我们通过调用lv_roller_set_selected函数将选中项重置为第一项。

使用lv_roller_set_options函数时,选项字符串必须以“\n”结尾,否则滚轮的显示将会出现异常。