LVGL_V8.3入门四---圆形表盘UI设计(字体、图片、时间显示设计)

本文介绍了如何使用LVGL库在V8.3版本中实现一个动态的圆形表盘UI,包括日期、时间显示和图片设置,以提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

LVGL_V8.3入门一
LVGL_V8.3入门二—实时时钟(模仿华为watch-UI)
LVGL_V8.3入门三—圆形表盘UI设计(圆弧)

前言

在现代界面设计中,用户体验至关重要。表盘是一种直观而有效的方式,通过图形化的形式向用户传达信息。为了创造出令人印象深刻的用户界面,我选择使用LVGL(LittlevGL)库,这是一个功能强大而灵活的开源图形库。在这篇博客中,我将分享我的经验,介绍如何使用LVGL创建一个引人注目的圆形表盘UI。


一、实验效果

在这里插入图片描述

二、日期字体设置

在这里插入图片描述
设置字体颜色
在这里插入图片描述
利用取色器进行取色比较方便
在这里插入图片描述

三、图片设置

在阿里云矢量图官网可以下载一些图标https://www.iconfont.cn/
在这里插入图片描述
png下载
在这里插入图片描述
但是直接下载的图片可能会太大,可以利用美图秀秀进行更改
在这里插入图片描述
最终效果图
在这里插入图片描述

四、导出代码

将导出的代码加入已经有的LVGL框架,下面是生成的代码
在这里插入图片描述
但使用SquareLine工具导出代码时,图片颜色会有偏差并且有的图片会乱码。解决方法是:利用下面的官方转换工具进行转换,将转换后的.c文件复制到相对应的目录。
https://lvgl.io/tools/imageconverter

time_refresh()函数用于更新时间

// This file was generated by SquareLine Studio
// SquareLine Studio version: SquareLine Studio 1.3.2
// LVGL version: 8.3.6
// Project name: cirspj

#include "ui.h"
#include <stdio.h>
#include "stm32f7xx_hal.h"
#include "ui_CirWatchUi.h"

lv_obj_t *ui_Screen2;
lv_obj_t *ui_Arc1;
lv_obj_t *ui_Arc2;
lv_obj_t *ui_Arc3;
lv_obj_t *ui_Label1;
lv_obj_t *ui_Label2;
lv_obj_t *ui_Label3;
lv_obj_t *ui_Label4;
lv_obj_t *ui_Image1;
lv_obj_t *ui_Image2;
lv_obj_t *ui_Label5;
lv_obj_t *ui_Image3;
lv_obj_t *ui_Label6;
lv_obj_t *ui_Image5;
lv_obj_t *ui_Label7;
lv_obj_t *ui____initial_actions0;

RTC_DateTypeDef GetData;  //获取日期结构�?

RTC_TimeTypeDef GetTime;   //获取时间结构�?

RTC_HandleTypeDef hrtc;

static void time_refresh(lv_event_t* event) {

	uint8_t timeStr[10];
	uint8_t dataStr[10];

	 /* Get the RTC current Time */
	HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
    /* Get the RTC current Date */
    HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);

    sprintf(timeStr, "%02d:%02d:%02d", GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
    lv_label_set_text(ui_Label1,timeStr);

    sprintf(dataStr, "%02d/%02d", GetData.Month, GetData.Date);
    lv_label_set_text(ui_Label1,timeStr);






//    lv_img_set_angle(ui_Image5, GetTime.Seconds * 60);//s秒表
//    lv_img_set_angle(ui_Image4, GetTime.Minutes * 60);//m分钟
//    lv_img_set_angle(ui_Image3, GetTime.Hours * 300);//h时
//    lv_refr_now(NULL);
}

static void send_event(void){
    lv_event_send(ui_Screen2,LV_EVENT_REFRESH,NULL);
}

void ui_CirWatchUi_screen_Iinit(void)
{
	ui_Screen2 = lv_obj_create(NULL);
	lv_obj_clear_flag( ui_Screen2, LV_OBJ_FLAG_SCROLLABLE );    /// Flags

	ui_Arc1 = lv_arc_create(ui_Screen2);
	lv_obj_set_width( ui_Arc1, 210);
	lv_obj_set_height( ui_Arc1, 210);
	lv_obj_set_align( ui_Arc1, LV_ALIGN_CENTER );
	lv_arc_set_value(ui_Arc1, 68);
	lv_arc_set_bg_angles(ui_Arc1,90,270);
	lv_obj_set_style_arc_color(ui_Arc1, lv_color_hex(0x8680F9), LV_PART_MAIN | LV_STATE_DEFAULT );
	lv_obj_set_style_arc_opa(ui_Arc1, 150, LV_PART_MAIN| LV_STATE_DEFAULT);
	lv_obj_set_style_arc_width(ui_Arc1, 15, LV_PART_MAIN| LV_STATE_DEFAULT);

	lv_obj_set_style_arc_color(ui_Arc1, lv_color_hex(0x8680F9), LV_PART_INDICATOR | LV_STATE_DEFAULT );
	lv_obj_set_style_arc_opa(ui_Arc1, 255, LV_PART_INDICATOR| LV_STATE_DEFAULT);
	lv_obj_set_style_arc_width(ui_Arc1, 15, LV_PART_INDICATOR| LV_STATE_DEFAULT);

	lv_obj_set_style_bg_color(ui_Arc1, lv_color_hex(0xFFFFFF), LV_PART_KNOB | LV_STATE_DEFAULT );
	lv_obj_set_style_bg_opa(ui_Arc1, 0, LV_PART_KNOB| LV_STATE_DEFAULT);

	ui_Arc2 = lv_arc_create(ui_Screen2);
	lv_obj_set_width( ui_Arc2, 156);
	lv_obj_set_height( ui_Arc2, 210);
	lv_obj_set_x( ui_Arc2, 1 );
	lv_obj_set_y( ui_Arc2, 29 );
	lv_obj_set_align( ui_Arc2, LV_ALIGN_CENTER );
	lv_arc_set_value(ui_Arc2, 68);
	lv_arc_set_bg_angles(ui_Arc2,90,270);
	lv_obj_set_style_arc_color(ui_Arc2, lv_color_hex(0x5DDBE5), LV_PART_MAIN | LV_STATE_DEFAULT );
	lv_obj_set_style_arc_opa(ui_Arc2, 150, LV_PART_MAIN| LV_STATE_DEFAULT);
	lv_obj_set_style_arc_width(ui_Arc2, 15, LV_PART_MAIN| LV_STATE_DEFAULT);

	lv_obj_set_style_arc_color(ui_Arc2, lv_color_hex(0x46DEF0), LV_PART_INDICATOR | LV_STATE_DEFAULT );
	lv_obj_set_style_arc_opa(ui_Arc2, 255, LV_PART_INDICATOR| LV_STATE_DEFAULT);
	lv_obj_set_style_arc_width(ui_Arc2, 15, LV_PART_INDICATOR| LV_STATE_DEFAULT);

	lv_obj_set_style_bg_color(ui_Arc2, lv_color_hex(0xFFFFFF), LV_PART_KNOB | LV_STATE_DEFAULT );
	lv_obj_set_style_bg_opa(ui_Arc2, 0, LV_PART_KNOB| LV_STATE_DEFAULT);

	ui_Arc3 = lv_arc_create(ui_Screen2);
	lv_obj_set_width( ui_Arc3, 100);
	lv_obj_set_height( ui_Arc3, 210);
	lv_obj_set_x( ui_Arc3, 1 );
	lv_obj_set_y( ui_Arc3, 58 );
	lv_obj_set_align( ui_Arc3, LV_ALIGN_CENTER );
	lv_arc_set_value(ui_Arc3, 68);
	lv_arc_set_bg_angles(ui_Arc3,90,270);
	lv_obj_set_style_arc_color(ui_Arc3, lv_color_hex(0xF4AE4B), LV_PART_MAIN | LV_STATE_DEFAULT );
	lv_obj_set_style_arc_opa(ui_Arc3, 150, LV_PART_MAIN| LV_STATE_DEFAULT);
	lv_obj_set_style_arc_width(ui_Arc3, 15, LV_PART_MAIN| LV_STATE_DEFAULT);

	lv_obj_set_style_arc_color(ui_Arc3, lv_color_hex(0xF4AE4B), LV_PART_INDICATOR | LV_STATE_DEFAULT );
	lv_obj_set_style_arc_opa(ui_Arc3, 255, LV_PART_INDICATOR| LV_STATE_DEFAULT);
	lv_obj_set_style_arc_width(ui_Arc3, 15, LV_PART_INDICATOR| LV_STATE_DEFAULT);

	lv_obj_set_style_bg_color(ui_Arc3, lv_color_hex(0xFFFFFF), LV_PART_KNOB | LV_STATE_DEFAULT );
	lv_obj_set_style_bg_opa(ui_Arc3, 0, LV_PART_KNOB| LV_STATE_DEFAULT);

	ui_Label1 = lv_label_create(ui_Screen2);
	lv_obj_set_width( ui_Label1, LV_SIZE_CONTENT);  /// 1
	lv_obj_set_height( ui_Label1, LV_SIZE_CONTENT);   /// 1
	lv_obj_set_x( ui_Label1, 21 );
	lv_obj_set_y( ui_Label1, 1 );
	lv_obj_set_align( ui_Label1, LV_ALIGN_CENTER );
	lv_label_set_text(ui_Label1,"11:10");
	lv_obj_set_style_text_font(ui_Label1, &lv_font_montserrat_26, LV_PART_MAIN| LV_STATE_DEFAULT);

	ui_Label2 = lv_label_create(ui_Screen2);
	lv_obj_set_width( ui_Label2, LV_SIZE_CONTENT);  /// 1
	lv_obj_set_height( ui_Label2, LV_SIZE_CONTENT);   /// 1
	lv_obj_set_x( ui_Label2, 30 );
	lv_obj_set_y( ui_Label2, -69 );
	lv_obj_set_align( ui_Label2, LV_ALIGN_CENTER );
	lv_label_set_text(ui_Label2,"6570");
	lv_obj_set_style_text_color(ui_Label2, lv_color_hex(0x6AC2CD), LV_PART_MAIN | LV_STATE_DEFAULT );
	lv_obj_set_style_text_opa(ui_Label2, 255, LV_PART_MAIN| LV_STATE_DEFAULT);

	ui_Label3 = lv_label_create(ui_Screen2);
	lv_obj_set_width( ui_Label3, LV_SIZE_CONTENT);  /// 1
	lv_obj_set_height( ui_Label3, LV_SIZE_CONTENT);   /// 1
	lv_obj_set_x( ui_Label3, 29 );
	lv_obj_set_y( ui_Label3, -97 );
	lv_obj_set_align( ui_Label3, LV_ALIGN_CENTER );
	lv_label_set_text(ui_Label3,"68%");
	lv_obj_set_style_text_color(ui_Label3, lv_color_hex(0xB4AEEE), LV_PART_MAIN | LV_STATE_DEFAULT );
	lv_obj_set_style_text_opa(ui_Label3, 255, LV_PART_MAIN| LV_STATE_DEFAULT);
	lv_obj_set_style_text_font(ui_Label3, &lv_font_montserrat_14, LV_PART_MAIN| LV_STATE_DEFAULT);

	ui_Label4 = lv_label_create(ui_Screen2);
	lv_obj_set_width( ui_Label4, LV_SIZE_CONTENT);  /// 1
	lv_obj_set_height( ui_Label4, LV_SIZE_CONTENT);   /// 1
	lv_obj_set_x( ui_Label4, 27 );
	lv_obj_set_y( ui_Label4, -39 );
	lv_obj_set_align( ui_Label4, LV_ALIGN_CENTER );
	lv_label_set_text(ui_Label4,"426");
	lv_obj_set_style_text_color(ui_Label4, lv_color_hex(0xFFAE8B), LV_PART_MAIN | LV_STATE_DEFAULT );
	lv_obj_set_style_text_opa(ui_Label4, 255, LV_PART_MAIN| LV_STATE_DEFAULT);
	lv_obj_set_style_text_font(ui_Label4, &lv_font_montserrat_14, LV_PART_MAIN| LV_STATE_DEFAULT);

	ui_Image1 = lv_img_create(ui_Screen2);
	lv_img_set_src(ui_Image1, &ui_img_step_png);
	lv_obj_set_width( ui_Image1, LV_SIZE_CONTENT);  /// 1
	lv_obj_set_height( ui_Image1, LV_SIZE_CONTENT);   /// 1
	lv_obj_set_x( ui_Image1, 30 );
	lv_obj_set_y( ui_Image1, 74 );
	lv_obj_set_align( ui_Image1, LV_ALIGN_CENTER );
	lv_obj_add_flag( ui_Image1, LV_OBJ_FLAG_ADV_HITTEST );   /// Flags
	lv_obj_clear_flag( ui_Image1, LV_OBJ_FLAG_SCROLLABLE );    /// Flags

	ui_Image2 = lv_img_create(ui_Screen2);
	lv_img_set_src(ui_Image2, &ui_img_power_png);
	lv_obj_set_width( ui_Image2, LV_SIZE_CONTENT);  /// 1
	lv_obj_set_height( ui_Image2, LV_SIZE_CONTENT);   /// 1
	lv_obj_set_x( ui_Image2, 26 );
	lv_obj_set_y( ui_Image2, 103 );
	lv_obj_set_align( ui_Image2, LV_ALIGN_CENTER );
	lv_obj_add_flag( ui_Image2, LV_OBJ_FLAG_ADV_HITTEST );   /// Flags
	lv_obj_clear_flag( ui_Image2, LV_OBJ_FLAG_SCROLLABLE );    /// Flags

	ui_Label5 = lv_label_create(ui_Screen2);
	lv_obj_set_width( ui_Label5, LV_SIZE_CONTENT);  /// 1
	lv_obj_set_height( ui_Label5, LV_SIZE_CONTENT);   /// 1
	lv_obj_set_x( ui_Label5, 31 );
	lv_obj_set_y( ui_Label5, 44 );
	lv_obj_set_align( ui_Label5, LV_ALIGN_CENTER );
	lv_label_set_text(ui_Label5,"PAI");
	lv_obj_set_style_text_color(ui_Label5, lv_color_hex(0xF6AE4A), LV_PART_MAIN | LV_STATE_DEFAULT );
	lv_obj_set_style_text_opa(ui_Label5, 255, LV_PART_MAIN| LV_STATE_DEFAULT);
	lv_obj_set_style_text_font(ui_Label5, &lv_font_montserrat_14, LV_PART_MAIN| LV_STATE_DEFAULT);

	ui_Image3 = lv_img_create(ui_Screen2);
	lv_img_set_src(ui_Image3, &ui_img_rate_png);
	lv_obj_set_width( ui_Image3, LV_SIZE_CONTENT);  /// 1
	lv_obj_set_height( ui_Image3, LV_SIZE_CONTENT);   /// 1
	lv_obj_set_x( ui_Image3, 84 );
	lv_obj_set_y( ui_Image3, 26 );
	lv_obj_set_align( ui_Image3, LV_ALIGN_CENTER );
	lv_obj_add_flag( ui_Image3, LV_OBJ_FLAG_ADV_HITTEST );   /// Flags
	lv_obj_clear_flag( ui_Image3, LV_OBJ_FLAG_SCROLLABLE );    /// Flags

	ui_Label6 = lv_label_create(ui_Screen2);
	lv_obj_set_width( ui_Label6, LV_SIZE_CONTENT);  /// 1
	lv_obj_set_height( ui_Label6, LV_SIZE_CONTENT);   /// 1
	lv_obj_set_x( ui_Label6, 82 );
	lv_obj_set_y( ui_Label6, 44 );
	lv_obj_set_align( ui_Label6, LV_ALIGN_CENTER );
	lv_label_set_text(ui_Label6,"98");

	ui_Image5 = lv_img_create(ui_Screen2);
	lv_img_set_src(ui_Image5, &ui_img_weather_png);
	lv_obj_set_width( ui_Image5, LV_SIZE_CONTENT);  /// 1
	lv_obj_set_height( ui_Image5, LV_SIZE_CONTENT);   /// 1
	lv_obj_set_x( ui_Image5, 81 );
	lv_obj_set_y( ui_Image5, -43 );
	lv_obj_set_align( ui_Image5, LV_ALIGN_CENTER );
	lv_obj_add_flag( ui_Image5, LV_OBJ_FLAG_ADV_HITTEST );   /// Flags
	lv_obj_clear_flag( ui_Image5, LV_OBJ_FLAG_SCROLLABLE );    /// Flags

	ui_Label7 = lv_label_create(ui_Screen2);
	lv_obj_set_width( ui_Label7, LV_SIZE_CONTENT);  /// 1
	lv_obj_set_height( ui_Label7, LV_SIZE_CONTENT);   /// 1
	lv_obj_set_x( ui_Label7, 68 );
	lv_obj_set_y( ui_Label7, -70 );
	lv_obj_set_align( ui_Label7, LV_ALIGN_CENTER );
	lv_label_set_text(ui_Label7,"12/11");

/**< 设置LV_EVENT_REFRESH事件的回调 */
	 lv_obj_add_event_cb(ui_Screen2, time_refresh,LV_EVENT_REFRESH ,NULL);

	  /**<每个1秒发一次LV_EVENT_REFRESH事件*/
	 lv_timer_create((void*)send_event, 1000, NULL);

}

总结

通过这篇博客,你将学到如何使用LVGL创建一个引人注目的圆形表盘UI。LVGL提供了丰富的功能和灵活性,使得用户界面的设计变得轻而易举。我希望这篇博客能够帮助你更好地理解LVGL的使用方法,并在你的项目中创造出独特而美观的用户体验。

【RT-Thread作品秀】基于 lvgl 的漏电保护装置校验仪 UI 界面设计作者:赵加文 概述低压漏电引起的各种安全事故已经严重影响到生产生活,威胁到生命财产安全。而解决这一现象的设备就是漏电保护开关,漏电保护开关的漏报率、误报率是很关键的参数,因此有必要对漏电保护开关的性能进行测试。因此,漏电保护装置校验仪是很有必要的。 开发环境硬件:ART-Pi 开发板,正点原子 480*272 4.3寸 RGB 屏幕 RT-Thread版本:4.0.3 开发工具及版本: RT-Thread Studio 2.0.0 :编写 编译 调试 下载代码 STM32CubeMX 6.1.0: codeBlocks 20.03:用于在 PC 机上进行 lvgl 模拟 MCU_Font V2.0: 用于转换中文,然后使得中文能够在 lvgl显示 RT-Thread使用情况概述在 UI 设计的整个过程中,使用到 RT-Thread 的部分主要有以下几个方面: 内核部分:动态线程,信号量 组件部分:PIN 设备、I2C 设备、TOUCH 设备框架、LCD 设备框架、finsh 组件 软件包部分:littlevgl2rtt、gt9147 硬件框架软件框架说明系统整体流程图: 软件模块说明整个UI 系统设计所遵循的是 lvgl 图形库的一个回调函数的机制,将各个事件与对应的操作所绑定起来,当滑动滑条时对应的滑条的回调函数就会被触发,那么就会执行滑条回调函数的内容,当滑动点击文本框时,文本框对应的回调函数就会被触发,进而创建键盘的控件,通过键盘输入所需要的数据。 演示效果图片展示: 演示视频: 比赛感悟这次参赛,之前还没有使用过 RT-Thread studio 这个集成开发环境,这次在使用 ART-Pi 的时候全程是使用 RT-Thread studio 这个开发环境,在使用的过程中也碰到了很多问题,有时候明明配置了相关组件,但是保存之后,并没有代码添加到工程里。现在也没有弄明白问题出在哪里,虽然存在着这里问题,但是在使用的过程中,还是非常的方便,整个开发过程就如同搭积木一样方便,与 RTT操作系统贴合的非常的紧密。 除此之外,便是在使用 lvgl 的过程中碰到了很多的问题,现在网上的教程基本是 lvgl v6 版本的教程,关于 lvgl v7 版本的教程很少,而且 v6版本与 V7 版本的 API 相差很大,不能按照 V6 版本来使用 V7 ,在这个过程中摸索了好多,同时也感受到了 lvgl 的魅力,使用在嵌入式系统上是非常不错的选择。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值