LVGL_基础控件线条line

news2024/11/27 1:33:16

LVGL_基础控件线条line

1、创建基础空间line(只创建出来是没有东西显示的)

/* 创建一个 line 组件(对象),他的父对象是活动屏幕对象 */
lv_obj_t * line = lv_line_create(lv_scr_act());

2、添加点,把这些点连成线
在这里插入图片描述

/*
设置一组点,用来提供给line组件画线
这个数组应该是静态、全局或动态分配的,不能是函数中的局部变量
因为lv_line_set_points保存的只是该数组的指针
*/
static lv_point_t line_points[] = { {5, 5}, {70, 70}, {120, 10}, {180, 60}, {240, 10} };

/* 创建一个 line 组件(对象),他的父对象是活动屏幕对象 */
lv_obj_t * line = lv_line_create(lv_scr_act());

lv_line_set_points(line, line_points, 5);     	// 设置点数组。line将连接这些点,按顺序画出直线

3、设置线条的样式
在这里插入图片描述

static lv_point_t line_points[] = { {5, 5}, {70, 70}, {120, 10}, {180, 60}, {240, 10} };

/* 创建一个 line 组件(对象),他的父对象是活动屏幕对象 */
lv_obj_t * line = lv_line_create(lv_scr_act());

lv_line_set_points(line, line_points, 5);     	// 设置点数组。line将连接这些点,按顺序画出直线

/*创建一个共享样式*/
static lv_style_t style_line;
lv_style_init(&style_line);
// 下面3个样式是 line 的专有样式接口,类似于arc
lv_style_set_line_width(&style_line, 8);
lv_style_set_line_color(&style_line, lv_palette_main(LV_PALETTE_BLUE));
// 使用这个样式能让画出来的线条看起来更平滑
lv_style_set_line_rounded(&style_line, true);
lv_obj_add_style(line, &style_line, 0);

4、设置大小(超出部分会看不到)
在这里插入图片描述

/*
如果设置了大小,那么有些超出设置大小的部分将会看不到
默认不需要设置大小,line会根据给出的points自动调整大小以此展示所有的points。这和label组件类似
*/
lv_obj_set_size(line, 150, 60);

5、坐标系反转(LCD坐标系和数学坐标系的Y轴相反)
在这里插入图片描述

lv_line_set_y_invert(line, true);// 反转y轴,LCD坐标系->平面直角坐标系第一象限

6、设置控件位于左下角
在这里插入图片描述

lv_obj_set_align(line, LV_ALIGN_BOTTOM_LEFT); // 放在屏幕的右下角,看起来更直观

7、设置背景颜色
在这里插入图片描述

// 设置line的背景颜色
lv_style_set_bg_opa(&style_line, LV_OPA_100);
lv_style_set_bg_color(&style_line, lv_color_hex(0xed1c24));

8、实战项目
在这里插入图片描述


#define DISP_VER_RES  2048  /* 以屏幕宽度为x轴,每一个像素为一个整数点 */
#define SIN_POINT_MAX 600   /* 以屏幕高度为y轴,每一个像素为一个整数点 */
#define PI 3.1415926


/* 以屏幕宽度为x轴,每一个像素为一个整数点 */
static lv_point_t line_points[DISP_VER_RES] = { 0 };


static void sin_timer(lv_timer_t * timer);


void lv_100ask_demo_course_3_12_2(void)
{
    /*初始化line组件的样式*/
    static lv_style_t style_line;
    lv_style_init(&style_line);
    lv_style_set_line_width(&style_line, 8);
    lv_style_set_line_color(&style_line, lv_palette_main(LV_PALETTE_BLUE));
    lv_style_set_line_rounded(&style_line, true);

    //设置背景颜色
    lv_style_set_bg_opa(&style_line, LV_OPA_100);
    lv_style_set_bg_color(&style_line, lv_color_hex(0x78246a));

    /* 设置活动屏幕的背景颜色 */
    lv_obj_set_style_bg_opa(lv_scr_act(), LV_OPA_100, 0);
    lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x1e1e1e), 0);

    /*创建line并应用上面初始化的样式*/
    lv_obj_t * line;
    line = lv_line_create(lv_scr_act());
    // 不用设置大小,line会自动根据points调整大小
    //lv_obj_set_size(line, 1024, 600);
    lv_obj_add_style(line, &style_line, 0);

    lv_obj_align(line, LV_ALIGN_LEFT_MID, 0, 0);      // 从屏幕左边中间往屏幕右边中间刷新
    //lv_obj_align(line, LV_ALIGN_BOTTOM_LEFT, 0, 0);   // 从屏幕左边往屏幕右边刷新
    //lv_obj_align(line, LV_ALIGN_BOTTOM_RIGHT, 0, 0);  // 从屏幕右边往屏幕左边刷新

	// 反转y轴
    lv_line_set_y_invert(line, true);

    /*
        创建一个定时器每隔5ms刷新一次
        这里要注意的是,虽然你设置的每隔5ms一次,
        但是实际最小的周期时间,受限于 lv_task_handler 的睡眠时间;
        所以,我们这里设置的是 5ms,但是实际上是 ≥10ms,因为我们的 lv_task_handler 睡眠时间是 10ms。
        也就说我们创建的定时器的运行周期不可能小于 lv_task_handler 的运行周期
    */
    lv_timer_t * timer = lv_timer_create(sin_timer, 5,  line);
}


/**********************
 *   STATIC FUNCTIONS
 **********************/

/* 通过sin()函数用角度计算出每个点的值 */
// 参考链接:https://juejin.cn/post/6966760481528905764
static void sin_timer(lv_timer_t * timer)
{
  /*Use the user_data*/
  lv_obj_t * line = timer->user_data;
  static uint16_t i = 0;
  uint16_t j = 0;
  float hd = 0.0;     //弧度
  float fz = 0.0;     //峰值

  j = SIN_POINT_MAX / 2;
  hd = PI / j;

  // 超出屏幕宽度?
  if (i >= DISP_VER_RES)  i = 0;

  fz = j * sin( hd * i ) + j;
  line_points[i].y = (uint16_t)fz;
  line_points[i].x = i;

  printf("[%d, %d]\n", line_points[i].x, line_points[i].y);
  lv_line_set_points(line, line_points, i);     /*Set the points*/

  i++;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1097065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件路径操作

避开-转义字符 python文件路径导致的错误常常与“\”有关,因为在路径中的“\”常会被误认为转义字符。 所以在上述路径中,\table\name\rain中的\t,\n,\r都易被识别为转义字符。 解决的办法主要由以下三种: #1 前面加r表示不转义 pathr&quo…

南美厄瓜多尔市场最全分析开发攻略,收藏一篇就够了

2023年5月11日,中厄自由贸易协定签署,不仅标志着中国加强与拉美地区的经济合作,也为外贸人拓展市场提供了巨大的机会。厄瓜多尔是一个具有潜力的市场,其年轻的消费群体和较高的互联网普及率为外贸人提供了广阔的发展空间。今天来分…

网络安全工程师需要学什么?零基础怎么从入门到精通,看这一篇就够了

网络安全工程师需要学什么?零基础怎么从入门到精通,看这一篇就够了 我发现关于网络安全的学习路线网上有非常多看似高大上却无任何参考意义的回答。大多数的路线都是给了一个大概的框架,告诉你那些东西要考,以及建议了一个学习顺…

超高度近视+白内障,爱尔眼科周进院长助患者视界“焕新”

57岁的徐女士自幼就是高度近视并开始戴眼镜,且近视度数逐年增加,很快便发展成了2000多度的超高度近视,最终在爱尔眼科四川眼科周进院长的帮助下,一次手术同时解决了高度近视和白内障的问题,视力得以改善,50…

Notepad ++ 零基础入门到精通安装与配置教程(非常详细)

Notepad 获取与安装 —————————— Notepad 是什么 在运行中输入 notepad 会弹出来记事本: 所以 Notepad 就是增强的记事本!这个跟 C 与 C 的名字是一样滴! Notepad 是 Windows 操作系统下的一套文本编辑器 软件版权许可证 GPL有…

css 左右滚轮无缝衔接

最近的项目有做到一个功能 类似跑马灯或者公告栏那种 有文字 也有列表的 所以 写了两种 第一种公告栏文字是用的js 第二种图文类型是用的css 两种方法 记录一下 第一种 纯文字滚动 其实也是根据js去计算dom的宽度 通过js去给css赋值 <div class"div1"><div …

Python抽奖系统-----控制台显示

以下是一个 Python 抽奖系统&#xff0c;其中包含更多的功能&#xff0c;如添加参与者、多轮抽奖、保存获奖者名单等&#xff1a; import random import osdef load_participants():try:with open("participants.txt", "r") as file:participants file.r…

Makefile——Linux下C/C++编译方法

目录 1. C1.1 编译C1.2 创建静态库1.3 创建动态库 2. C3. Makefile3.1 变量3.2 常用函数3.3 makefile编译文件 1. C linux下常见的C语言项目相关的文件如下图所示。 1.1 编译C 通常使用GCC来编译C文件。编译过程为源文件.c文件 -> 预编译成.i文件 -> 编译成汇编语言.…

【mfc/VS2022】计图实验:绘图工具设计知识笔记2

按钮添加处理程序 1.类视图找到对应类右击&#xff0c;类向导 2. 找到对应的的按钮id 如何将画出的两个相交的圆都显示出来&#xff0c;而不是重叠&#xff08;如下图&#xff09;隐藏了一条圆弧 问题如图&#xff1a; 因为矩形和圆心其实是个背景色的封闭图形&#xff0c;所…

ggplot2 -- geom_linerange 函数的简单使用

brief 需要三个参数确定一个直线&#xff0c;x轴位置&#xff0c;y轴起始位置&#xff0c;y轴结束位置。 有别于一些垂直辅助线&#xff0c;可以实现柱状图&#xff0c;瓷砖图等等。 example 实现柱状图 library(tidyverse)tibble(theta seq(from 0, to 1, by .1),prio…

【一周安全资讯1014】交通运输部发布《公路工程设施支持自动驾驶技术指南》;多地网信办对违反数据安全法规企业作出行政处罚

要闻速览 1.交通运输部发布《公路工程设施支持自动驾驶技术指南》 2.数据泄漏被传输境外后擅自删库&#xff01;某科技公司被上海市网信办依法处罚 3.浙江省网信办对杭州某科技公司未履行数据安全保护义务依法作出行政处罚 4.超140亿元资金失窃&#xff1f;印度一支付网关服务…

【Java】HIS医院信息化管理系统源码(SaaS模式多医院)

【Java】HIS医院信息化管理系统源码&#xff08;SaaS应用&#xff09;&#xff0c;系统采用主流成熟技术开发&#xff0c;B/S架构&#xff0c;软件结构简洁、代码规范易阅读&#xff0c;SaaS应用&#xff0c;全浏览器访问&#xff0c;前后端分离&#xff0c;多服务协同&#xf…

百度智能云-身份证验证(完整版-直接用)

百度云网址: https://cloud.baidu.com 身份验证的技术文档: 技术代码: 导入依赖: <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.12.13</version><scope>compile<…

操作系统学习——进程调度

三种不同的调度 进程调度的两种基本方式 非剥夺方式&#xff1a;一旦吧处理机分配给某个进程后&#xff0c;便让他一直运行&#xff0c;知道进程完成或者发生某事件而阻塞&#xff0c;才把处理机转给另一个进程。 剥夺方式&#xff1a;某个进程运行时&#xff0c;如果有中断或…

flutter app开发环境搭建

Flutter是一个跨终端、多设备的应用界面开发工具&#xff0c;其支持web端、移动端、桌面端以及嵌入式不同应用场景的应用开发&#xff0c;其使用dart语言作为开发语言&#xff0c;本文主要描述Flutter开发环境搭建。 如上所示&#xff0c;从Flutter官方网站下载最新版本的Flutt…

AP8851H 降压恒压DC电源芯片 5V12V 零功耗快充应用

1&#xff0c;产品描述 AP8851H 一款宽电压范围降压型 DC-DC 电源管理芯片&#xff0c;内部集成使能 开关控制、基准电源、误差放大器、过 热保护、限流保护、短路保护等功能&#xff0c; 非常适合在宽输入电压范围具有优良 的负载和线性调整度。 AP8851H 芯片包含每周期的峰值…

iOS开发- CMMotionManager 开发

文章目录 一、CMMotionManager1.1 push方式1.2pull 方式 二、设备运动类型1. attitude2. rotationRate3. gravity4. userAcceleration5. magneticField & heading iOS 中常见传感器如下所示: 类型作用环境光传感器感应光照强度距离传感器感应靠近设备屏幕的物体磁力计传感器…

千兆光模块和万兆光模块的适用场景有哪些

随着数字化和物联网的普及&#xff0c;对网络速度和带宽的要求也越来越高。千兆光模块和万兆光模块是两种常见的光模块&#xff0c;在不同的应用场景中&#xff0c;它们各具优势。下面我们来探讨一下千兆光模块和万兆光模块的主要适用场景。 首先是企业网络。千兆光模块常用于…

环形海尔贝克Halbach磁体阵列

环形海尔贝克阵列是一种特殊形状的磁体结构&#xff0c;它的设计思路是通过将形状相同磁化方向不同的多个磁体组合而成一个圆环形磁体&#xff0c;以增强工作面或中心磁场的均匀性和稳定性。使用Halbach阵列结构的永磁电机较传统永磁电机具有更接近正弦分布的气隙磁场&#xff…

【LeetCode热题100】--105.从前序与中序遍历序列构造二叉树

105.从前序与中序遍历序列构造二叉树 二叉树前序遍历顺序&#xff1a;根左右 二叉树中序遍历顺序&#xff1a;左根右 只要我们在中序遍历中定位到根节点&#xff0c;那么我们就可以分别知道左子树和右子树中的节点数目。由于同一颗子树的前序遍历和中序遍历的长度显然是相同的…