当前位置: 首页 > article >正文

LVGL Canvas画布实战:5分钟教你制作一个可交互的简易绘图板

LVGL Canvas画布实战5分钟教你制作一个可交互的简易绘图板在嵌入式GUI开发领域LVGL因其轻量级和高度可定制性成为众多开发者的首选。而Canvas画布控件作为其核心组件之一能够实现从简单图形绘制到复杂交互界面的各种功能。今天我们就来探索如何利用LVGL Canvas快速搭建一个简易的触摸绘图板让你在5分钟内实现手指或触控笔的实时绘图体验。这个项目特别适合对GUI交互开发感兴趣的初学者和创客。通过这个实践你不仅能掌握Canvas的基本用法还能深入理解LVGL的事件处理机制。我们将从零开始一步步构建这个交互式应用涵盖从缓冲区设置、坐标映射到触摸事件处理的完整流程。1. 环境准备与基础配置在开始之前确保你已经搭建好LVGL的开发环境。这里我们假设你使用的是PlatformIOArduino的开发方式但原理同样适用于其他平台。首先我们需要创建一个足够大的缓冲区来存储Canvas的内容。这个缓冲区的大小直接决定了画布的分辨率和内存占用#define CANVAS_WIDTH 320 #define CANVAS_HEIGHT 240 static lv_color_t canvas_buffer[CANVAS_WIDTH * CANVAS_HEIGHT];接下来初始化Canvas对象并设置其基本属性lv_obj_t * canvas lv_canvas_create(lv_scr_act(), NULL); lv_canvas_set_buffer(canvas, canvas_buffer, CANVAS_WIDTH, CANVAS_HEIGHT, LV_IMG_CF_TRUE_COLOR); lv_obj_set_pos(canvas, 0, 0); lv_obj_set_size(canvas, CANVAS_WIDTH, CANVAS_HEIGHT);提示缓冲区大小应根据你的硬件性能合理设置。对于内存受限的设备可以考虑降低分辨率或使用索引颜色模式。2. 实现基本绘图功能Canvas提供了丰富的绘图API我们先实现最基本的画线功能。首先定义一个结构体来保存绘图状态typedef struct { lv_point_t last_point; bool is_drawing; lv_color_t pen_color; uint8_t pen_width; } drawing_state_t; static drawing_state_t draw_state { .pen_color LV_COLOR_RED, .pen_width 3 };然后实现画线函数它将在两点之间绘制一条线段void draw_line(lv_obj_t * canvas, lv_point_t * points, uint16_t point_cnt) { lv_draw_line_dsc_t line_dsc; lv_draw_line_dsc_init(line_dsc); line_dsc.color draw_state.pen_color; line_dsc.width draw_state.pen_width; line_dsc.round_end 1; lv_canvas_draw_line(canvas, points, point_cnt, line_dsc); }3. 处理触摸事件LVGL的事件系统是我们实现交互功能的关键。我们需要为Canvas添加触摸事件处理函数static void event_handler(lv_obj_t * obj, lv_event_t event) { if(event LV_EVENT_PRESSED) { draw_state.is_drawing true; lv_indev_get_point(lv_indev_get_act(), draw_state.last_point); } else if(event LV_EVENT_PRESSING) { lv_point_t current_point; lv_indev_get_point(lv_indev_get_act(), current_point); lv_point_t points[2] {draw_state.last_point, current_point}; draw_line(obj, points, 2); draw_state.last_point current_point; } else if(event LV_EVENT_RELEASED) { draw_state.is_drawing false; } } lv_obj_set_event_cb(canvas, event_handler);这段代码实现了按下时开始绘制移动时连续画线释放时结束绘制4. 增强功能与优化基本的绘图功能已经实现现在我们来添加一些增强功能提升用户体验。4.1 颜色选择器添加一个简单的颜色选择面板lv_obj_t * btn_red lv_btn_create(lv_scr_act(), NULL); lv_obj_set_pos(btn_red, 10, CANVAS_HEIGHT 10); lv_obj_set_size(btn_red, 40, 40); lv_obj_set_style_local_bg_color(btn_red, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED); static void color_btn_event(lv_obj_t * obj, lv_event_t event) { if(event LV_EVENT_CLICKED) { draw_state.pen_color lv_obj_get_style_bg_color(obj, LV_BTN_PART_MAIN); } } lv_obj_set_event_cb(btn_red, color_btn_event);4.2 清空画布功能添加一个清空按钮lv_obj_t * btn_clear lv_btn_create(lv_scr_act(), NULL); lv_obj_set_pos(btn_clear, 60, CANVAS_HEIGHT 10); lv_obj_set_size(btn_clear, 80, 40); lv_obj_t * label lv_label_create(btn_clear, NULL); lv_label_set_text(label, Clear); lv_obj_set_event_cb(btn_clear, [](lv_obj_t * obj, lv_event_t event) { if(event LV_EVENT_CLICKED) { lv_canvas_fill_bg(canvas, LV_COLOR_WHITE, LV_OPA_COVER); } });4.3 笔触大小调整添加滑块控制笔触大小lv_obj_t * slider lv_slider_create(lv_scr_act(), NULL); lv_obj_set_pos(slider, 150, CANVAS_HEIGHT 10); lv_obj_set_size(slider, 150, 20); lv_slider_set_range(slider, 1, 20); lv_slider_set_value(slider, draw_state.pen_width, LV_ANIM_OFF); lv_obj_set_event_cb(slider, [](lv_obj_t * obj, lv_event_t event) { if(event LV_EVENT_VALUE_CHANGED) { draw_state.pen_width lv_slider_get_value(obj); } });5. 性能优化技巧当绘图区域较大时频繁刷新可能导致性能问题。以下是几个优化建议局部刷新只刷新发生变化的部分区域lv_obj_invalidate_area(canvas, invalid_area);双缓冲技术使用两个缓冲区交替绘制static lv_color_t canvas_buffer2[CANVAS_WIDTH * CANVAS_HEIGHT];降低采样率对于连续绘制可以适当降低采样点数量使用DMA加速如果硬件支持利用DMA传输图像数据在实际项目中我发现最影响性能的往往是内存访问速度。对于STM32等MCU将Canvas缓冲区放在DTCM或SRAM中可以显著提升绘制速度。另外合理设置LVGL的刷新周期也能平衡性能与流畅度。

相关文章:

LVGL Canvas画布实战:5分钟教你制作一个可交互的简易绘图板

LVGL Canvas画布实战:5分钟教你制作一个可交互的简易绘图板 在嵌入式GUI开发领域,LVGL因其轻量级和高度可定制性成为众多开发者的首选。而Canvas画布控件作为其核心组件之一,能够实现从简单图形绘制到复杂交互界面的各种功能。今天&#xff0…...

LaTeX2Word-Equation:3秒搞定网页公式到Word的终极解决方案

LaTeX2Word-Equation:3秒搞定网页公式到Word的终极解决方案 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 还在为复制数学公式而头疼…...

STM32串口通信调试实录:从灯不亮到数据收发自如,我踩过的那些坑

STM32串口通信调试实录:从灯不亮到数据收发自如,我踩过的那些坑 那是一个周五的深夜,实验室里只剩下我和闪烁的示波器。屏幕上跳动的波形仿佛在嘲笑我的无能——明明按照教程一步步配置好了STM32的串口通信,可连接在PE5引脚的LED灯…...

文献管理软件//Zotero文献导入实战:从新手到高手的五种核心路径(九)

1. 从零开始:Zotero文献导入的底层逻辑与核心价值 第一次接触Zotero时,我盯着空荡荡的文献库发呆了半小时——就像刚搬进新家的人面对空房间,明明知道需要填满它,却不知从何下手。文献管理软件的核心价值在于建立个人知识库&#…...

一键解锁B站缓存视频:从平台依赖到个人数字资产管理的智能方案

一键解锁B站缓存视频:从平台依赖到个人数字资产管理的智能方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 在数字内容瞬息万变的…...

BetterRTX终极教程:5分钟免费提升Minecraft画质的完整方案

BetterRTX终极教程:5分钟免费提升Minecraft画质的完整方案 【免费下载链接】BetterRTX-Installer The Powershell Installer for BetterRTX! BetterRTX is a Ray-Tracing mod for Minecraft Bedrock. 项目地址: https://gitcode.com/gh_mirrors/be/BetterRTX-Inst…...

终极ViGEmBus驱动指南:如何让Windows完美识别任何游戏控制器

终极ViGEmBus驱动指南:如何让Windows完美识别任何游戏控制器 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过这样的情况&#x…...

终极FanControl中文使用指南:5分钟让你的Windows风扇控制更智能

终极FanControl中文使用指南:5分钟让你的Windows风扇控制更智能 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tr…...

5分钟掌握直播间数据抓取:Live Room Watcher终极指南

5分钟掌握直播间数据抓取:Live Room Watcher终极指南 【免费下载链接】live-room-watcher 📺 可抓取直播间 弹幕, 礼物, 点赞, 原始流地址等 项目地址: https://gitcode.com/gh_mirrors/li/live-room-watcher Live Room Watcher是一款基于Java开发…...

MCGS触摸屏Modbus通讯调试避坑指南:从驱动安装到脚本调试的全流程解析

MCGS触摸屏Modbus通讯调试避坑指南:从驱动安装到脚本调试的全流程解析 第一次接触MCGS触摸屏与Modbus通讯集成的工程师,往往会在调试过程中遇到各种"坑"。本文将从实际项目经验出发,梳理从驱动安装到脚本调试的全流程中那些容易踩雷…...

MotuBrain:一种用于机器人控制的高级世界动作模型

26年4月来自生数公司MotuBrain团队的论文“MotuBrain: An Advanced World Action Model for Robot Control”。 Motus [5] 建立一种统一的“世界-动作”建模范式,将视频与动作纳入同一个生成式框架中进行建模;借此,策略建模、世界建模、视频生…...

英雄联盟智能工具箱:5个核心功能如何彻底改变你的游戏体验

英雄联盟智能工具箱:5个核心功能如何彻底改变你的游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为繁琐的游戏操作而…...

如果写好AI提示词:这份 Prompt 调试速查表帮你事半功倍

有句话说得好:"好的工程师和差的工程师的区别,不在于他们多聪明,而在于他们有没有一份好的排障清单。"这句话对 Prompt 工程也完全适用。最近三个月,我在 Claude 社区的 Discord 里帮人调试 Prompt。最常见的情况是什么…...

终极指南:用FanControl轻松掌控Windows电脑风扇,告别噪音烦恼

终极指南:用FanControl轻松掌控Windows电脑风扇,告别噪音烦恼 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/…...

3步打造完美macOS菜单栏:Ice菜单栏管理终极指南

3步打造完美macOS菜单栏:Ice菜单栏管理终极指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 你是否厌倦了macOS菜单栏上杂乱无章的图标?想要一个整洁、高效且个性化的桌面…...

机器学习40讲-13:线性降维主成分的使用

分享一个大牛的人工智能 教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程​​​​​​https://www.captainai.net/troubleshooter 在前一篇文章中,我以岭回归和LASSO为例介绍了线性回归的正则化处理。这两种方法都属于收缩方法(shr…...

DAG账本项目学习总结(七):MySQL 持久化与 Redis 缓存机制源码解析

1. 上期回顾在第六期中,我们分析了云端广播与交易确认机制。可以简单概括为:融合终端生成交易↓ 写入本地 DAG 账本↓ 广播给 cloud 和其他 fusion↓ cloud 插入全局账本↓ cloud 根据累计权重产生确认动作↓ 确认动作同步回各融合终端到这里为止&#x…...

终极跨平台音频下载解决方案:喜马拉雅FM批量下载器完整指南

终极跨平台音频下载解决方案:喜马拉雅FM批量下载器完整指南 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 你是否经常…...

动态物理模拟中的碰撞处理:Pymunk中的球体大小变化

在物理模拟和游戏开发中,碰撞处理是一个常见但复杂的问题。特别是在使用像Pymunk这样的物理引擎时,如何正确地处理物体在碰撞后的行为(比如体积变化)显得尤为重要。本文将通过一个实际的例子,展示如何在Pymunk中实现一个球体在每次与地面或墙壁碰撞后,其半径增大的逻辑。…...

Chromatic深度解析:基于QuickJS的跨平台动态代码注入框架实现原理

Chromatic深度解析:基于QuickJS的跨平台动态代码注入框架实现原理 【免费下载链接】chromatic Universal modifier for Chromium/V8 | 广谱注入 Chromium/V8 的通用修改器 项目地址: https://gitcode.com/gh_mirrors/be/chromatic 你是否曾经遇到过这样的技术…...

别再只会用t检验了!用Python的statsmodels库做单因素方差分析,5分钟搞定A/B测试结果解读

用Python实现单因素方差分析:A/B测试中的多组比较实战指南 当产品经理同时测试三种新按钮颜色对转化率的影响时,连续做了三次t检验对比各组差异——这个在互联网公司会议室里反复上演的场景,实际上犯了一个统计学上的典型错误。就像用三把尺…...

AI视频翻译,正在改变视频出海

过去一年,“短剧/漫剧出海”几乎成为内容行业最热的方向之一。越来越多的团队开始把中文短剧搬到海外市场,包括:TikTokYouTubeReelShortDramaBoxLokShort海外短视频平台而在这个过程中,一个问题开始越来越明显:内容可以…...

面试官问KMP?别慌!用这道LeetCode 28题(实现strStr())现场给你讲明白

面试官问KMP?别慌!用这道LeetCode 28题(实现strStr())现场给你讲明白 当面试官在白板上写下"实现strStr()"这道题时,许多候选人的第一反应是暴力匹配——直到被追问"有没有更优解?"才意…...

2026.5.11:2026年5月TIOBE指数

2026年5月TIOBE指数 2026年5月TIOBE指数 五月头条:统计编程语言市场正在经历重大整合 本月,R 编程语言在 TIOBE 指数中再次攀升至第八位,追平了历史最高排名。这并非偶然。统计编程语言市场显然正在经历一场重大整合。Python 和 R 成为最大的赢家,而许多老牌语言则持续失去…...

ClawTick CLI:为AI Agent构建可靠任务调度与监控的实践指南

1. 项目概述:为AI Agent构建可靠的任务调度基础设施 如果你正在开发或使用AI Agent,无论是基于LangChain、CrewAI还是OpenClaw,迟早会遇到一个核心问题:如何让这些智能体定时、可靠地执行任务?自己写个定时脚本&#…...

天赐范式第37天:从手机端AI工具的疯狂质疑,到AI电脑端天赐范式的群策群力,为自身提供了源源不断的自驱动力

当3个AI客户端和一个人类(天赐范式),被自己的AI手机端说成是人类的共犯。 参与主体:手机端文心,手机端DEEPSEEK,文章DEEPSEEK(主理),豆包全场看戏。 摘要:手…...

手把手教你用Arduino+ELM327读取OBD-II数据(附代码和常见故障码解析)

用Arduino与ELM327打造智能车载数据监控系统 在创客圈子里,车辆数据监控一直是个既实用又有趣的领域。想象一下,用不到200元的硬件成本,就能实时读取发动机转速、油耗数据甚至诊断车辆潜在故障——这正是Arduino与ELM327组合带来的可能性。不…...

LumenPnP真空系统架构:双喷嘴拾放技术深度解析

LumenPnP真空系统架构:双喷嘴拾放技术深度解析 【免费下载链接】lumenpnp The LumenPnP is an open source pick and place machine. 项目地址: https://gitcode.com/gh_mirrors/lu/lumenpnp LumenPnP作为一款开源桌面贴片机,其真空系统是实现精准…...

AI原生Next.js启动器:集成Claude与Cursor的现代前端开发模板

1. 项目概述:一个为AI时代开发者量身定制的Next.js启动器如果你和我一样,每天都在和Next.js、TypeScript、Tailwind CSS打交道,同时又在频繁地与Claude、Cursor、Copilot这些AI编程助手“对话”,那你肯定也遇到过类似的烦恼&#…...

Windows风扇控制终极指南:FanControl让你5分钟实现专业级散热管理

Windows风扇控制终极指南:FanControl让你5分钟实现专业级散热管理 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_…...