lvgl 实现状态提示图标自动对齐补位显示

实现思路

  • 通过数组索引表示状态图标or文字的位置
  • 定时更新图标在数组的位置,然后再进行图标对齐,数组第n个元素向第n-1个元素对齐

具体实现

1、数据结构

struct state_prompts_pos {
    lv_obj_t* prompts;
};

static struct state_prompts_pos _state_prompts_pos[5] = {
    {.prompts = NULL},
    {.prompts = NULL},
    {.prompts = NULL},
    {.prompts = NULL},
    {.prompts = NULL},
};

#define STATE_PROMPTS_SIZE(_state_prompts)    (sizeof(_state_prompts)/sizeof(_state_prompts[0]))

  • lvgl用lv_obj_t表示元素,所以数组元素类型定义为lv_obj_t
  • 数组的每一位表示一个状态。

2、向数组插入状态图标

static void state_prompts_set_prompts(lv_obj_t* prompts)
{
     /* There has been a prompts */
    for (char i = 0; i < STATE_PROMPTS_SIZE(_state_prompts_pos); i++)
    {
       if (_state_prompts_pos[i].prompts == prompts)  
        {
            return; 
        }
    }
    
    for (char i = 0; i < STATE_PROMPTS_SIZE(_state_prompts_pos); i++)
    {
        if (_state_prompts_pos[i].prompts == NULL)    /* find a free place */
        {
            _state_prompts_pos[i].prompts = prompts;
            lv_obj_set_hidden(prompts, false);
            //printf("set %d\r\n", i);
            break;
        }
    }
}
  • 需要保持obj在数组中的唯一性,插入的obj前是否已经在数组中
  • lv_obj_set_hidden(prompts, false),图标已经提前创建好,所以直接取消隐藏显示出来

3、从数组中删除obj

static void state_prompts_reset_prompts(lv_obj_t* prompts)
{
    for (char i = 0; i < STATE_PROMPTS_SIZE(_state_prompts_pos); i++)
    {
        if (_state_prompts_pos[i].prompts == prompts)
        {
            _state_prompts_pos[i].prompts = NULL;
            lv_obj_set_hidden(prompts, true);
            //printf("reset %d\r\n", i);
            break;
        }
    }
}
  • if (_state_prompts_pos[i].prompts == prompts) 在数据找到了要删除的obj
  • lv_obj_set_hidden(prompts, true);,将图标隐藏,不显示
  • _state_prompts_pos[i].prompts = NULL;,将当前数组元素指针置NULL表示当前位置没有图标

4、更新状态图标位置

static void state_prompts_align_not_0(lv_obj_t* obj, lv_obj_t *base, lv_coord_t x, lv_coord_t y)
{
    lv_obj_align(obj, base, LV_ALIGN_OUT_LEFT_MID, x, y);
}

void lv_update_state_prompts_pos_change(void)
{
    for (char i = 0; i < (STATE_PROMPTS_SIZE(_state_prompts_pos)); i++)
    {
        if (_state_prompts_pos[i].prompts == NULL)  /* if current obj is NULL */
        {
            char y = 0;
            for (y = i; y < STATE_PROMPTS_SIZE(_state_prompts_pos)-1; y++)   
            {
                if (_state_prompts_pos[y].prompts) break;     
            }
            _state_prompts_pos[i].prompts = _state_prompts_pos[y].prompts;
            _state_prompts_pos[y].prompts = NULL;
        }
    }
    
    if (_state_prompts_pos[0].prompts)
    {
        lv_obj_t* par = lv_scr_act();
        lv_obj_align(_state_prompts_pos[0].prompts, par, LV_ALIGN_IN_TOP_RIGHT, -10, 30);
    }

    for (char i = 1; i < STATE_PROMPTS_SIZE(_state_prompts_pos); i++)
    {
        if (_state_prompts_pos[i].prompts == NULL) continue;
        
        state_prompts_align_not_0(_state_prompts_pos[i].prompts, _state_prompts_pos[i-1].prompts, -10, 0);
    }
}
  • 先更新数组元素,在进行对齐;当数组当前元素为NULL,就向上查找不为NULL的,将其移到到当前位置,然后将从图标的位置置NULL
  • if (_state_prompts_pos[0].prompts) ,特殊处理第1个图标位置
  • state_prompts_align_not_0(_state_prompts_pos[i].prompts, _state_prompts_pos[i-1].prompts, -10, 0);其他图标向前一个图标对齐

5、使用

  • 创建1个定时lvgl task,在task回调函数中调用lv_update_state_prompts_pos_change
  • 在状态的条件触发时,调用state_prompts_set_prompts插入obj
  • 在状态条件取消时,调用state_prompts_reset_prompts删除obj

实现效果

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要让 ECharts 图例多行信息显示并且图标首行对齐,可以通过设置图例的对齐方式和样式来实现。具体步骤如下: 1. 设置图例的对齐方式 在 ECharts 中,可以通过设置 legend.align 属性来控制图例的对齐方式。将该属性设置为 'left'、'center' 或 'right' 可以让图例水平居左、居中或居右对齐。例如: ``` legend: { align: 'left', // 图例水平居左对齐 // ... } ``` 2. 设置图例的样式 在 ECharts 中,可以通过设置 textStyle 属性来控制图例项的样式。将该属性设置为一个样式对象,可以对图例项的文字样式进行统一设置,例如: ``` legend: { textStyle: { fontSize: 12, // 图例项文字的字体大小 lineHeight: 20 // 图例项文字的行高 }, // ... } ``` 3. 设置图例项的高度 在 ECharts 中,可以通过设置 legend.itemHeight 属性来控制图例项的高度。将该属性设置为一个数值,可以对图例项的高度进行统一设置,例如: ``` legend: { itemHeight: 20, // 图例项的高度为 20 // ... } ``` 综上所述,要让 ECharts 图例多行信息显示并且图标首行对齐,可以通过设置 legend.align、textStyle 和 legend.itemHeight 属性来实现。具体代码示例如下: ``` legend: { align: 'left', // 图例水平居左对齐 itemHeight: 20, // 图例项的高度为 20 textStyle: { fontSize: 12, // 图例项文字的字体大小 lineHeight: 20 // 图例项文字的行高 }, // ... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲盖弥彰1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值