【电子量产工具】4. UI系统

简介: 【电子量产工具】4. UI系统

前言

最近看了 电子量产工具 这个项目,本专栏是对该项目的一个总结。


一、UI界面分析

UI用户界面(User Interface)的缩写,指的是人与计算机或其他设备进行交互时所使用的界面。用户界面是用户与系统之间的桥梁,提供了一种方式让用户与计算机进行沟通、操作和获取信息。

用户界面可以包括以下几个方面:

  • 图形用户界面(GUI)。
  • 命令行界面(CLI)
  • 触摸界面
  • 声音界面
  • 虚拟现实界面(VR)和增强现实界面(AR)

我们的UI系统,就是构造各类GUI元素,比如按钮(目前只实现按钮)。

二、结构体描述按钮

/* 函数指针(绘制按键) */
typedef int (*ONDRAW_FUNC)(struct Button *ptButton, PDispBuff ptDispBuff);
/* 函数指针(按下按钮) */
typedef int (*ONPRESSED_FUNC)(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent);
typedef struct Button {
  char *name;               // 按键 名字
  int status;               //按键 按下状态
  Region tRegion;             // 按键的区域
  ONDRAW_FUNC OnDraw;           //一个 ONDRAW_FUNC 类型的函数指针,用于指向按钮绘制函数
  ONPRESSED_FUNC OnPressed;       //一个 ONPRESSED_FUNC 类型的函数指针,用于指向按钮按下事件处理函数
}Button, *PButton;
typedef struct Region {       //区域包括 左上角坐标, 高, 宽
  int iLeftUpX;
  int iLeftUpY;
  int iWidth;
  int iHeigh;
}Region, *PRegion;

三、按钮初始化

void InitButton(PButton ptButton, char *name, PRegion ptRegion, ONDRAW_FUNC OnDraw, ONPRESSED_FUNC OnPressed)
{
  ptButton->status = 0;       //初始状态为 0 ,未按下
  ptButton->name = name;
  ptButton->tRegion = *ptRegion;      // 按钮的区域
  ptButton->OnDraw    = OnDraw ? OnDraw : DefaultOnDraw;    //若 OnDraw 为空,则执行默认绘制函数DefaultOnDraw
  ptButton->OnPressed = OnPressed ? OnPressed : DefaultOnPressed;  //若 OnPressed 为空,则执行默认绘制函数DefaultOnPressed
}

四、默认绘制按键事件函数

绘制各个按钮 Button 的底色,文字,并将其刷新到 DispBuff 上

static int DefaultOnDraw(struct Button *ptButton, PDispBuff ptDispBuff)
{
  /* 绘制底色 */
  DrawRegion(&ptButton->tRegion, BUTTON_DEFAULT_COLOR);   // 红色 0xff0000
  /* 居中写文字 */
  DrawTextInRegionCentral(ptButton->name, &ptButton->tRegion, BUTTON_TEXT_COLOR);   //黑色 0x000000
  /* flush to lcd/web */
  FlushDisplayRegion(&ptButton->tRegion, ptDispBuff);
  return 0;
}
  1. 绘制底色
void DrawRegion(PRegion ptRegion, unsigned int dwColor)
{
  int x = ptRegion->iLeftUpX;
  int y = ptRegion->iLeftUpY;
  int width = ptRegion->iWidth;
  int heigh = ptRegion->iHeigh;
  int i,j;
  for (j = y; j < y + heigh; j++)
  {
    for (i = x; i < x + width; i++)
      PutPixel(i, j, dwColor);      //描点函数
  }
}
  1. 居中写文字
    在 一定的区域 Region,按颜色 dwColor 居中显示名字 name
void DrawTextInRegionCentral(char *name, PRegion ptRegion, unsigned int dwColor)
{
  int n = strlen(name);
  int iFontSize = ptRegion->iWidth / n / 2;
  FontBitMap tFontBitMap;
  int iOriginX, iOriginY;
  int i = 0;
  int error;
  if (iFontSize > ptRegion->iHeigh)       //计算字体大小
    iFontSize =  ptRegion->iHeigh;
  /* 当前文字的基点 */
  iOriginX = (ptRegion->iWidth - n * iFontSize)/2 + ptRegion->iLeftUpX;
  iOriginY = (ptRegion->iHeigh - iFontSize)/2 + iFontSize + ptRegion->iLeftUpY;
  SetFontSize(iFontSize);         // 设置字体大小
  while (name[i])     //字符编码
  {
    /* get bitmap */
    tFontBitMap.iCurOriginX = iOriginX;
    tFontBitMap.iCurOriginY = iOriginY;
    error = GetFontBitMap(name[i], &tFontBitMap);   //根据字符编码获取位图,保存在 参数 tFontBitMap中
    if (error)
    {
      printf("SelectAndInitFont err\n");
      return;
    }
    /* draw on buffer */    
    DrawFontBitMap(&tFontBitMap, dwColor);      // 绘制位图 
    iOriginX = tFontBitMap.iNextOriginX;      //获取下一文字的基点坐标
    iOriginY = tFontBitMap.iNextOriginY;  
    i++;
  }
}
  1. 将绘制到的按钮,刷新到 buffer 上。

返回 LCDframebuffer , 以后上层 APP 可以直接操作LCD, 可以不用 FbFlushRegion

也可以 malloc 返回一块无关的buffer, 要使用 FbFlushRegion

这里 为了 以后代码的可移植性,加上了刷新界面,但 并未做出任何举动。

五、默认按下按键事件函数

按下按键事件函数 也需要 上面 绘制函数 里的 : 绘制底色, 居中写文字 ,刷新界面。这里就不再 重述了。

static int DefaultOnPressed(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent)
{
  unsigned int dwColor = BUTTON_DEFAULT_COLOR;    //按钮初始颜色 红色,0xff0000
  ptButton->status = !ptButton->status;       // 按钮状态,未按下时 为 0 
  if (ptButton->status)
    dwColor = BUTTON_PRESSED_COLOR;         //按下的颜色为 绿色, 0x00ff00
  /* 绘制底色 */
  DrawRegion(&ptButton->tRegion, dwColor);
  /* 居中写文字 */
  DrawTextInRegionCentral(ptButton->name, &ptButton->tRegion, BUTTON_TEXT_COLOR);
  /* 刷新界面 到 lcd/web */
  FlushDisplayRegion(&ptButton->tRegion, ptDispBuff);
  return 0;
}

六、测试程序

  1. 显示界面初始化
  2. 字体初始化
  3. ui 界面
  /* 设置按钮的显示位置,宽高 */
  tRegion.iLeftUpX = 200;
  tRegion.iLeftUpY = 200;
  tRegion.iWidth   = 300;
  tRegion.iHeigh   = 100;
  /* 显示 "test", 调用默认绘制,按下函数 */
  InitButton(&tButton, "test", &tRegion, NULL, NULL);
  tButton.OnDraw(&tButton, ptBuffer);       //绘制按键
  while (1)
  {
    tButton.OnPressed(&tButton, ptBuffer, NULL);  //按下按键,
    sleep(2);   // 休眠 2 秒
  }

实验效果

实验结果就是每隔 2 秒,自动 变换按键的颜色。(我按钮后面的图是 自己的QT界面,忽略即可)


总结

UI 系统界面的逻辑性 不难,就是一些函数的编写有些困难。

这些封装好的代码,可以用于以后代码的一直调用。

相关文章
|
7月前
|
Linux 测试技术
Linux基础项目开发1:量产工具——UI系统(五)
Linux基础项目开发1:量产工具——UI系统(五)
72 0
Linux基础项目开发1:量产工具——UI系统(五)
|
19天前
|
前端开发 数据安全/隐私保护
全新紫色新UI数码盲盒系统源码/全开源无加密/附教程
全新紫色新UI数码盲盒系统源码/全开源无加密/附教程 前端uniapp+H5 后端FastAdmin框架 可打包成APP多端运行 亲测可用
42 13
|
2月前
|
机器学习/深度学习 数据可视化 计算机视觉
基于opencv的车牌识别系统(UI界面采用tkinter设计)
基于opencv的车牌识别系统(UI界面采用tkinter设计)
53 0
|
4月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
71 1
|
4月前
|
搜索推荐 数据库
最新UI六零导航系统源码 | 多模版全开源
使用PHP+MySql,增加后台管理 多模板选择,支持在后台切换模板 增加常用搜索引擎,如:知乎、哔哩哔哩、在线翻译等(支持自定义) 支持用户提交收录申请,地址:http://域名/apply 部分模板优化和增加部分功能,如返回顶部、获取输入框焦点、时间日期显示等
81 1
|
4月前
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
116 0
|
5月前
|
小程序 PHP
全新UI自助图文打印系统小程序源码 PHP后端 附教程
全新UI自助图文打印系统小程序源码 PHP后端 附教程
287 2
|
5月前
|
异构计算 Python
30行代码实现一个带UI界面的图片背景移除工具:并附带web网页
人工智能技术正处于蓬勃发展中,移除图片背景的方法众多,涵盖了各式各样的实现途径和模型。然而,这些方法往往在安装和配置环境方面稍显复杂。今天,介绍一种极其简便的方法——大约30行代码,就能实现这一功能。虽然相比之下可能稍显简单,但对于不太苛刻的需求来说,这种方法颇为方便实用。
|
5月前
|
编解码 前端开发 图形学
采用Canvas Scaler与锚点系统实现UI自适应多屏幕分辨率
【7月更文第10天】在游戏开发或应用设计中,确保用户界面(UI)能够在不同屏幕分辨率和纵横比上保持良好显示效果是一项基本要求。Unity 引擎通过其强大的 UI 系统,特别是 Canvas Scaler 和锚点系统,为开发者提供了实现这一目标的高效工具。本文将深入探讨如何结合使用这两个功能来创建自适应UI布局,以适配广泛的设备屏幕。
242 0
|
5月前
|
JavaScript
F12控制台打印报Syntax Error: D:\project\xxxx\xxxx\若依系统\RuoYi-Vue-master\ruoyi-ui\src\views,console打印没加““
F12控制台打印报Syntax Error: D:\project\xxxx\xxxx\若依系统\RuoYi-Vue-master\ruoyi-ui\src\views,console打印没加““