lvgl 自己看系列

lv_obj_invalidate()

 `lv_obj_invalidate()` 函数是 LVGL图形库中的一个函数,用于标记一个对象(object)需要重新绘制。当一个对象的外观或状态发生变化时,需要重新绘制该对象以反映这些变化。lv_obj_invalidate()函数可以将该对象标记为需要重新绘制,从而触发重新绘制操作。

        具体来说,`lv_obj_invalidate()` 函数会将对象的 `invalidate` 标志位置为 `true`,表示该对象需要重新绘制。在 LittlevGL 的绘图循环中会检查所有对象的 `invalidate` 标志位,如果为 `true`,则会调用对象的绘制函数进行重新绘制。这样就可以实现对象的动态更新。需要注意的是,`lv_obj_invalidate()` 函数只是标记对象需要重新绘制,实际的重新绘制操作是在 LittlevGL 的绘图循环中进行的。
        因此,如果需要立即重新绘制对象,可以在调用 `lv_obj_invalidate()` 函数后手动调用 `lv_task_handler()` 函数来触发绘图循环

刷新整个屏幕对象:lv_obj_invalidate(lv_scr_act())

 lv_obj_update_layout 


        lv_obj_update_layout是一个LVGL函数,用于更新对象的布局。当对象的位置、大小或对齐方式发生变化时,需要调用此函数来更新对象的布局。
        具体来说,lv_obj_update_layout函数会重新计算对象的位置和大小,并根据对象的对齐方式将其放置在正确的位置。如果对象的位置或大小发生了变化,它还会更新对象的子对象的布局
需要注意的是,lv_obj_update_layout函数只会更新对象的布局,不会重新绘制对象。这意味着如果需要重新绘制对象,请调用lv_obj_invalidate函数。
        lv_obj_update_layout函数的函数原型:
        void lv_obj_update_layout(lv_obj_t * obj);
其中,obj是要更新布局的对象的指针。

lv_refr_join_area

lv_refr_join_area:对所有的脏域进行合并:


1.先对某一脏域的合并标志进行判断,如果不等于0,说明该脏域已经被合并过了,处理下一个脏域。
        if(disp_refr->inv_area_joined[join_in] != 0) continue;
2.只处理未连接或者未处理的区域并忽略其本身
         if(disp_refr->inv_area_joined[join_from] != 0 || join_in == join_from) {continue;}
3.检查这些未处理的区域是否有接触
        if(_lv_area_is_on(&disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]) == false) {continue;}
4.计算合并区域
        _lv_area_join(&joined_area, &disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]);
5.判断,仅仅当合并后的区域小于合并之前的面积,才会合并,并将合并后的区域加入inv_areas
        lv_area_copy(&disp_refr->inv_areas[join_in], &joined_area);
6.对处理过的脏域,进行标记
        disp_refr->inv_area_joined[join_from] = 1;

struct _lv_draw_unit_t


        在LVGL中,struct _lv_draw_unit_t是一个结构体,用于描述绘图任务的单元。它包含了一些绘图任务的相关信息,例如绘图任务的类型、绘图任务的坐标、绘图任务的颜色等。
struct _lv_draw_unit_t的主要作用是将绘图任务分解成小的单元,以便于在绘图过程中进行优化和调度。通过将绘图任务分解成小的单元,可以更好地控制绘图任务的执行顺序和优先级,从而提高绘图的效率和性能。
        此外,struct _lv_draw_unit_t还可以用于实现一些高级的绘图效果,例如渐变、阴影、透明度等。通过在struct _lv_draw_unit_t中添加一些额外的属性和参数,可以实现更加复杂和高级的绘图效果。

 涉及到的相关函数和处理过程

相关函数

lv_draw_dispatch_wait_for_request
        等待新的调度请求。
lv_draw_dispatch_request
        绘制单元完成绘制任务时,它需要请求调度,让 LVGL 为其分配新的绘制任务
lv_draw_get_next_available_task
        获取一个可用的绘制任务(source),屏幕上每个层面(layer)存在很多不挨着的脏域(join之后),每个这样的脏域,都是一个绘制任务
is_independent
        检查是否跟旧的绘制任务有重叠的区域
_lv_area_intersect
        检查两个区域是否有重叠

处理过程     

   LV_EVENT_PREPROCESS这个宏表示的是在class 类型的event cb处理之前,event 已经处理过了,当event code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) 时,调用绘制函数进行绘制,lv_obj_draw(e);

杂项


调色板


    data += LV_COLOR_INDEXED_PALETTE_SIZE(buf->header.cf) * sizeof(lv_color32_t);
#define LV_COLOR_INDEXED_PALETTE_SIZE(cf) ((cf) == LV_COLOR_FORMAT_I1 ? 2 :\
                                           (cf) == LV_COLOR_FORMAT_I2 ? 4 :\
                                           (cf) == LV_COLOR_FORMAT_I4 ? 16 :\
                                           (cf) == LV_COLOR_FORMAT_I8 ? 256 : 0)
从这可以看出不同格式下palette的大小。

  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值