这一篇来学习一下如何扩展当前主题,还是通过codeblock来模拟代码的运行,代码如下:
static lv_style_t g_style_btn;
/*当已经添加基本主题的样式添加新样式时,调用次函数*/
static void new_theme_apply_cb(lv_theme_t * th, lv_obj_t * obj)
{
LV_UNUSED(th);
if(lv_obj_check_type(obj, &lv_btn_class))
{
lv_obj_add_style(obj, &g_style_btn, 0);
}
}
static void new_theme_init_and_set(void)
{
/*初始化样式*/
lv_style_init(&g_style_btn);
lv_style_set_bg_color(&g_style_btn, lv_palette_main(LV_PALETTE_GREEN));
lv_style_set_border_color(&g_style_btn, lv_palette_darken(LV_PALETTE_GREEN, 3));
lv_style_set_border_width(&g_style_btn, 3);
/*通过当前主题初始化新主题*/
lv_theme_t * th_act = lv_disp_get_theme(NULL);
static lv_theme_t th_new;
th_new = *th_act;
/*设置父主题和新主题的样式适播放回调函数*/
lv_theme_set_parent(&th_new, th_act);
lv_theme_set_apply_cb(&th_new, new_theme_apply_cb);
/*显示新主题*/
lv_disp_set_theme(NULL, &th_new);
}
void lv_theme_change_test()
{
lv_obj_t * btn1 = NULL;
lv_obj_t * btn2 = NULL;
lv_obj_t * label = NULL;
btn1 = lv_btn_create(lv_scr_act());
if (btn1 != NULL)
{
lv_obj_align(btn1, LV_ALIGN_TOP_MID, 0, 20);
label = lv_label_create(btn1);
if (label != NULL)
{
lv_label_set_text(label, "Original theme");
}
}
new_theme_init_and_set();
btn2 = lv_btn_create(lv_scr_act());
if (btn2 != NULL)
{
lv_obj_align(btn2, LV_ALIGN_BOTTOM_MID, 0, -20);
label = lv_label_create(btn2);
if (label != NULL)
{
lv_label_set_text(label, "New theme");
}
}
}
运行结果: