LVGL-obj对象

2023-11-08

对象创建

1、lv中所有的对象都以obj为基础进行扩展的。创建对象时父对象是空,则在显示器屏链表增加一个节点,父对象非空则在其子链表增加一个节点。创建完成会通过parent->signal_cb(parent, LV_SIGNAL_CHILD_CHG, new_obj)通知父对象。

lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
{
    lv_obj_t * new_obj = NULL;

    /*Create a screen*/
    if(parent == NULL) {
        LV_LOG_TRACE("Screen create started");
        lv_disp_t * disp = lv_disp_get_default();
        if(!disp) {
            LV_LOG_WARN("lv_obj_create: not display created to so far. No place to assign the new screen");
            return NULL;
        }

        new_obj = _lv_ll_ins_head(&disp->scr_ll);
        LV_ASSERT_MEM(new_obj);
        if(new_obj == NULL) return NULL;

        _lv_memset_00(new_obj, sizeof(lv_obj_t));

    }
    /*Create a normal object*/
    else {

    }

    ……

    /*Init realign*/
#if LV_USE_OBJ_REALIGN
    new_obj->realign.align        = LV_ALIGN_CENTER;
    new_obj->realign.xofs         = 0;
    new_obj->realign.yofs         = 0;
    new_obj->realign.base         = NULL;
    new_obj->realign.auto_realign = 0;//自动对齐关闭
#endif
    ……

    if(copy == NULL) {
        if(parent != NULL) lv_theme_apply(new_obj, LV_THEME_OBJ);
        else lv_theme_apply(new_obj, LV_THEME_SCR);//设置风格
    }
    else {
        lv_style_list_copy(&new_obj->style_list, &copy->style_list);
    }
    /*Copy the attributes if required*/
    if(copy != NULL) {

    ……
    }

    /*Send a signal to the parent to notify it about the new child*/
    if(parent != NULL) {
        parent->signal_cb(parent, LV_SIGNAL_CHILD_CHG, new_obj);

        /*Invalidate the area if not screen created*/
        lv_obj_invalidate(new_obj);
    }

    LV_LOG_INFO("Object create ready");

    return new_obj;
}

2、obj->coords是对象的绝对(显示)坐标。所以每次更新坐标同时通知子对象,自己,父对象。

void lv_obj_set_pos(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
{
    LV_ASSERT_OBJ(obj, LV_OBJX_NAME);

    /*Convert x and y to absolute coordinates*/
    lv_obj_t * par = obj->parent;

    if(par) {
        x = x + par->coords.x1;
        y = y + par->coords.y1;
    }

    /*Calculate and set the movement*/
    lv_point_t diff;
    diff.x = x - obj->coords.x1;
    diff.y = y - obj->coords.y1;

    /* Do nothing if the position is not changed */
    /* It is very important else recursive positioning can
     * occur without position change*/
    if(diff.x == 0 && diff.y == 0) return;
    if(obj->refr == false)  return;

    /*Invalidate the original area*/
    lv_obj_invalidate(obj);

    /*Save the original coordinates*/
    lv_area_t ori;
    lv_obj_get_coords(obj, &ori);

    obj->coords.x1 += diff.x;
    obj->coords.y1 += diff.y;
    obj->coords.x2 += diff.x;
    obj->coords.y2 += diff.y;

    refresh_children_position(obj, diff.x, diff.y);

    /*Inform the object about its new coordinates*/
    obj->signal_cb(obj, LV_SIGNAL_COORD_CHG, &ori);

    /*Send a signal to the parent too*/
    if(par) par->signal_cb(par, LV_SIGNAL_CHILD_CHG, obj);

    /*Invalidate the new area*/
    lv_obj_invalidate(obj);
}

对象重新对齐

#if LV_USE_OBJ_REALIGN
typedef struct {
    const struct _lv_obj_t * base;
    lv_coord_t xofs;
    lv_coord_t yofs;
    lv_align_t align;
    uint8_t auto_realign : 1;
    uint8_t mid_align : 1; /**< 1: the origo (center of the object) was aligned with
                                `lv_obj_align_origo`*/
} lv_realign_t;
#endif

两个有用的接口

void lv_obj_realign(lv_obj_t * obj)

void lv_obj_set_auto_realign(lv_obj_t * obj, bool en)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LVGL-obj对象 的相关文章

随机推荐

  • 适合Python 的5大练手项目,你练了么?

    往期好文推荐 0基础不用怕 从0到1轻松教你入门Python python系统学习流线图 教你一步一步学会python 但是在练手项目的选择上 还存在疑问 不知道要从哪种项目先下手 python教程入门学习 首先有两点建议 最好不要写太应用
  • ios后台运行

    iOS在升级到4 0以后就支持了多任务了 下文将详细介绍一下这个特性 1 检查设备是否支持多任务 Apple出于性能的考虑 并不是所有的iOS设备升级到iOS4以后都支持多任务 比如iPhone 3G 如果你的应用在没有多任务特性时会出问题
  • Nv21转Bitmap(高效率转化)

    转自 https blog csdn net qq1137830424 article details 81980673 版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 ht
  • 广义线性回归模型之0,1变量回归(logit/probit回归)—R语言实现

    1 广义线性回归 广义线性模型有三个组成部分 1 随机部分 即变量所属的指数族分布 族成员 诸如正态分布 二项分布 Poisson 分布等等 2 线性部分 即 x 3 连接函数 g R 中的广义线性模型函数glm 对指数族中某分布的默认连接
  • Redis的发布订阅模式:实现消息队列和实时数据推送的利器

    当涉及到实时数据推送和消息队列时 Redis的发布订阅模式是一种非常有用的工具 Redis是一个开源的内存数据库 被广泛用于缓存 队列和实时数据处理等方面 在本博客中 我们将重点介绍Redis的发布订阅模式 并且提供一些示例代码来帮助读者更
  • pandoc -crossref插件实现markdwon文档转word后公式编号自定义

    pandoc crossref插件实现markdwon文档转word后公式编号自定义 借助markdown撰写论文还是有一些优势的 公式可以通过vscode 提示直接快速地写出来 图片按照链接插入以后就可以自动更新图源 论文提交的时候需要转
  • Aviator 常见使用

    学习使用AviatorScript 写脚本对数据进行处理 这边写一些常见的例子 都使用表达式的方式 使用文本的话 无法传具体的参数 aviator maven最新的引用
  • 基于stm32单片机汽车胎压温度检测Proteus仿真程序

    采用stm32单片机作为主控CPU 采用BMP180传感器来测量气压和温度 采用LCD1602显示气压和温度 并且通过串口打印框也可以显示当前的气压和温度 完美的模拟出汽车胎压和温度检测相关功能 程序采用keil5编写 并且有中文注释 新手
  • [XAMPP的安装及使用教程] BUG解决

    说明 XAMPP的安装及使用教程 https blog csdn net qq 36595013 article details 80373597 转载 本文是针对原博客连接如上 安装过程中出现的bug进行解决 BUG1 前提 mysql端
  • 基于深度学习的高精度课堂人脸检测系统(PyTorch+Pyside6+YOLOv5模型)

    摘要 基于深度学习的高精度课堂人脸检测系统可用于日常生活中或野外来检测与定位课堂人脸目标 利用深度学习算法可实现图片 视频 摄像头等方式的课堂人脸目标检测识别 另外支持结果可视化与图片或视频检测结果的导出 本系统采用YOLOv5目标检测模型
  • 1084. 销售分析III(SQL)

    题目 https leetcode cn com problems sales analysis iii Table Product Column Name Type product id int product name varchar
  • demo演示是什么意思_路演(融资演示)时要注意些什么?

    路演 融资演示 究竟重不重要 如果你的企业足够优秀 那可能路演对你来说就没那么重要 甚至都不需要路演 可能就有很多投资人抢着来投你 但能达到这个水平的毕竟是少数 更多的是默默无闻的创业者 如果你的企业还没有那么优秀 或者你的产品还不够成熟
  • Python_捕获未知错误代码

    try num int input 请输入一个整数 result 8 num print result except Exception as result print 未知错误 s result
  • VScode编译调试C++环境

    首先去官网下载vscodehttps code visualstudio com 为了编译C C 要使用gcc Windows本身不支持gcc 所以有了MinGW 我用的是dev带的MinGW 也可以自己安装MinGW 或者用VS的编译器
  • VTM7.0配置并运行(windows系统)

    文章目录 一 下载安装VTM 下载方式一 下载方式二 1 解压VTM软件压缩包 2 在解压好的目录里新建 build 文件夹 二 下载安装Cmake 1 下载Cmake并解压 2 配置Cmake环境变量 三 编译 方法一 界面 1 打开 c
  • Netty案例(二)之耗时任务的处理

    文章目录 netty版本 Netty耗时任务的处理 代码案例 Handler 自定义业务线程池 Context中添加线程池 netty版本 使用的netty版本是io netty netty all 4 1 33 Final Netty耗时
  • 全网最好的免费开源ERP:Odoo库存路线规则设置应用详解

    引言 在库存管理中 供应链战略确定了产品何时应该采购或制造 交付到分销中心 并最终提供给零售渠道 在开源智造 Odoo免费开源ERP解决方案中 可以使用WMS应用中的仓库路线来配置产品的供应链策略 其中包括库内作业的拉取和推送规则 一旦一切
  • Java架构直通车——深入理解B+树

    文章目录 引入 AVL树和B树 AVL树 红黑树 B树 B 树 数据库为什么不使用二叉树 为什么使用B 树 与B树的区别 引入 AVL树和B树 AVL树 平衡二叉搜索树是基于二分法的策略提高数据的查找速度的二叉树的数据结构 平衡二叉搜索树的
  • 删除双系统中的一个linux,双系统删除linux

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 双系统删除linux系统2008 10 12 00 27方法一 我们知道在xp里一个很好的分区工具 PQ partition magic 但在双系统下 由于linux改变了xp里C盘的一个启动项
  • LVGL-obj对象

    对象创建 1 lv中所有的对象都以obj为基础进行扩展的 创建对象时父对象是空 则在显示器屏链表增加一个节点 父对象非空则在其子链表增加一个节点 创建完成会通过parent gt signal cb parent LV SIGNAL CHI