UI控件使用说明
文章目录
- 一、控件的公共属性
- 二、常用控件的私有属性
- 三、控件的显示与隐藏
一、控件的公共属性
struct element {u32 highlight: 1; //高亮标志u32 state: 3; //内核记录控件的状态u32 ref: 5; //内核计数值u32 prj: 3; //工程序号u32 hide_action: 1; //HIDE_WITH_REDRAW,HIDE_WITHOUT_REDRAW,u32 css_num : 2; //CSS的数量u32 page: 8; //页面序号u32 prior: 9; //优先级序号,大的在上层int id; //控件idstruct element *parent; //指向父控件的指针struct list_head sibling; //兄弟控件链表头struct list_head child; //子控件链表头 struct element *focus; //焦点控件elementstruct element_css css; //css属性struct draw_context *dc; //dc,platform层使用const struct element_event_handler *handler;//库注册的handerint group; //特效使用
};
struct element_css {u8 align: 2; //对齐方式u8 invisible: 1; //是否隐藏u8 z_order: 5; //子元素排列int left; //相对于父控件的左边界坐标int top; //相对于父控件的上边界坐标int width; //相对与父控件的宽度int height; //相对于父控件的高度u32 background_color: 24; //纯色背景颜色u32 alpha: 8; //window/layer/layout背景透明度int background_image: 24; //背景图片idint image_quadrant: 8; //象限,23指针使用struct css_border border; //边框struct css_rotate rotate; //旋转属性struct css_ratio ratio; //缩放
};
控件element均放置在控件句柄的第一个元素,即element与控件句柄指向同一地址,因此在确定控件类型的情况下,可以做转换
可以通过struct element *ui_core_get_element_by_id(u32 id)获取,养成判空好习惯
二、常用控件的私有属性
LAYOUT
struct layout {struct element elm; //公共属性u8 hide: 1; //是否隐藏u8 inited: 1; //是否被加载u8 release: 6;
u8 page;
//lua使用u8 movable; // 移动标志u8 star_menu; // 满天星标志struct list_head *icon_root; // 满天星icon的listint lcd_w; // 用于移动计算int lcd_h; // 用于移动计算struct element_luascript_t *lua;struct layout *layout; const struct layout_info *info; //存储的结构const struct element_event_handler *handler; //应用层注册的句柄
};
布局是UI设计中最常用的容器
控件存放于布局之中
同一页面可以拥有多个布局,子布局之间可以进行切换(show/hide)
涉及到组合控件的情况,一般是以布局为整体进行操作(案例:抽屉列表)
PIC
struct ui_pic {struct element elm; //公共属性char source[8]; //数据源(id不唯一或不固定时使用)u8 index; //图片索引u8 page; //u8 play_mode; //播放模式:不播放、循环、单次u16 play_interval; //播放间隔msvoid *timer; //timer_idstruct element_luascript_t *lua; const struct ui_pic_info *info; //图片infoconst struct element_event_handler *handler; //应用层注册的句柄
};
struct ui_pic_info {struct ui_ctrl_info_head head;char source[8];u8 highlight;u16 cent_x;u16 cent_y;u8 play_mode;u16 play_interval;struct ui_image_list *normal_img; //非高亮图片链表struct ui_image_list *highlight_img; //高亮图片链表struct element_event_action *action;
}
struct ui_image_list {u16 num; //图片数量u16 image[0]; //图片资源id
};
显示单张图片:背景图、图片列表
显示多张图片:图片列表切换索引
切换索引的接口有如下两个:
int ui_pic_show_image_by_id(int id, int index);
int ui_pic_set_image_index(struct ui_pic *pic, int index);
id的接口是自带刷新的,常用于onkey、ontouch中
句柄接口是不带刷新的,常用于onchange事件、控件集中刷新(大面积、多控件、短时间)
一般通过切换图片索引、缩放、旋转实现需要的效果
旋转和缩放不能同时使用
缩放:比例为0.125~8,图片最大尺寸240*240
旋转:图片的旋转中心需位于图片内
TEXT\TIME\NUMBER(文本类)
struct ui_text {struct element elm; //公共属性struct ui_text_attrs attrs; //文本类公共属性char source[8]; //数据源u16 timer; //刷新定时器u16 _str[UI_TEXT_LIST_MAX_NUM]; //文本列表信息char _format[7]; //格式”strpic””text””ascii”u8 str_num; //文本列表数量u8 index; //文本列表索引u8 page; struct element_luascript_t *lua;const struct ui_text_info *info; //文本存储
const struct element_event_handler *handler; //应用层注册的句柄
};
struct ui_text_attrs {const char *str; //文本数组*生命周期长于控件显示周期const char *format; //类型int color; //文本颜色565u16 strlen; //str长度u16 offset; //偏移距离,用于滚动u8 encode: 2; //编码u8 endian: 1; //大小端u8 flags: 5; //滚动/多行等u16 displen; //文本长度const char *mulstr; //多国语言混合的数组*生命周期长于控件显示周期u16 mulstr_len; //混合长度
u16 default_code; //默认字符自定义功能(字符显示不了时,用什么符号代替)u8 x_interval; //文本水平间距
};
struct ui_time {struct element_text text; //文本型元素公共属性char source[8]; //数据源u16 year: 12; //年u16 month: 4; //月u8 day; //日u8 hour; //时u8 min; //分u8 sec; //秒u8 css_num; //css数量u8 auto_cnt; //自动计数u8 page; u32 css[2]; //css地址int color; //文本颜色int hi_color; //高亮文本颜色u16 buf[20]; //存放显示内容buffer(因此time控件不存在buffer生命周期的问题)void *timer; //定时器idstruct element_luascript_t *lua;const struct ui_time_info *info;const struct element_event_handler *handler;//应用层注册的句柄
};
struct ui_number {struct element_text text;char source[8];u16 number[2];u16 buf[20]; //存放显示数字int color;int hi_color;u8 css_num;u8 page;u8 nums: 6; //number个数u8 type: 2; //数字型or文本型u32 css[2];u8 *num_str; //指向传入文本型的字符串,因此需要考虑生命周期u8 *temp_str;u16 temp_str_len;struct element_luascript_t *lua;const struct ui_number_info *info;const struct element_event_handler *handler;//应用层注册的句柄
};
struct element_text {struct element elm; //公共属性char *str; //显示字符const char *format; //字符格式void *priv; //elementint color; //颜色值u8 x_interval; //文本间隔const struct element_event_handler *handler;//应用层注册的句柄
};
如在onchange中修改文本的值,要在show_probe中进行,在show/show_post修改需要等下一次刷新才起作用
文本包括四类显示:字库、多国语言、多国语言拼接、数字&符号图片
GRID
struct ui_grid {struct element elm; //公共属性char hi_index; //高亮项索引char touch_index; //触摸项索引char cur_dindex; //动态高亮项索引char onfocus; //列表焦点标志,用于响应touch事件u8 page_mode; //跟手滑动和按页滚动标志u8 slide_direction; //滑动方向u8 col_num; //列数u8 row_num; //行数u8 show_row; //显示行数u8 show_col; //显示列数u8 avail_item_num; //有效项数u8 pix_scroll; //触摸标志u8 ctrl_num; //传入的有效项数u8 page; //所在页面u8 child_init; //子控件初始化标志u8 rotate; //垂直列表转为旋转列表标志luaint x_interval; //水平项间距(相对数值)int y_interval; //垂直项间距(相对数值)int max_show_left; //ui库使用计算变量int max_show_top; //ui库使用计算变量int min_show_left; //ui库使用计算变量int min_show_top; //ui库使用计算变量int max_left; //ui库使用计算变量int max_top; //ui库使用计算变量int min_left; //ui库使用计算变量
int min_top; //ui库使用计算变量int energy_timer; //惯性定时器idfloat energy_vx0; //惯性速度,由tp给出float energy_vy0; //惯性速度,由tp给出float energy_a; //惯性负加速度,固定参数float energy_val; //惯性系数,用于调整惯性大小u8 energy_xdir; //惯性方向u8 energy_ydir; //惯性方向u8 energy_status; //惯性状态u8 energy_tslide; //惯性滑动时间间隔,固定参数u8 flick_endflag; //回弹结束标志u8 flick_status; //回弹状态u16 flick_cmpsize; //回弹项sizeint flick_timer; //回弹定时器idint flick_distance; //回弹距离,中间变量int flick_overdis; //回弹目标距离int flick_resdis; //回弹步进float flick_v0; //回弹初速u16 center_target_line; //居中目标中线位置:0-10000u16 center_next_threshold; //居中滑入下一项阈值:0-10000u8 center_item_offset; //居中项偏移阈值:0-(avail_item_num-1)u8 center_index_mode; //居中项:高亮项or触摸项u8 auto_center_enable; //居中模式使能u8 flick_close; //回弹关闭struct element_luascript_t *lua;struct scroll_area *area; //滑动区域,需要传入全局变量or局部静态struct layout *item; //列表子项属性struct layout_info *item_info; //列表子项infostruct ui_grid_dynamic *dynamic; //动态列表信息struct position pos; //触摸点位struct draw_context dc; //不使用struct element_touch_event *e; //不适用const struct ui_grid_info *info; //列表infoconst struct element_event_handler *handler; //应用层注册的句柄u8 key_jump; //key_jump:静态垂直或者水平列表才能使用,使用按键滚动u8 hi_move; //滑动highlight_ajust使能void (*highlight_ajust)(struct ui_grid *grid, int direction);void (*end_once)(struct ui_grid *grid);
};struct ui_grid_dynamic {int dhi_index; //动态高亮项int dcol_num; //动态列数量int drow_num; //动态行数量int min_row_index; //最小行索引int max_row_index; //最大行索引int min_col_index; //最小列索引int max_col_index; //最大列索引int min_show_row_index;int max_show_row_index;int min_show_col_index;int max_show_col_index;int grid_xval; int grid_yval; u8 grid_col_num;u8 grid_row_num;u8 grid_show_row;u8 grid_show_col;int base_index_once; //first_show第一行索引int init_step_once; //first_show初始化步进
};
Slide
struct ui_slider {struct element elm; //公共属性struct element child_elm[SLIDER_CHILD_NUM]; //左右图片和点的elmu8 step; //步进,用于编码器u8 move; //char persent; //百分比s16 left; //左边界s16 width; //宽度s16 min_value; //最小值,用于文本显示s16 max_value; //最大值,用于文本显示u16 text_color; //文本颜色565struct element_luascript_t *lua;const struct ui_slider_info *info;const struct slider_text_info *text_info;const struct element_event_handler *handler;//应用层注册的句柄
};
垂直滑动条与水平滑动条一致
Compass
struct ui_compass {struct element elm; //公共属性struct element child_elm[COMPASS_CHILD_NUM]; //子控件属性struct compass_css_info child_css[COMPASS_CHILD_NUM]; //子控件csschar source[8]; //数据源int bk_angle : 16; //背景盘角度int indicator_angle : 16; //指针角度int last_bk_angle : 16; //上一次背景盘角度int last_indicator_angle : 16; //上一次指针角度u8 updata; //更新标志u8 ctrl_num; //子控件数量void *timer; //刷新定时器idconst struct layout_info *info;const struct compass_pic_info *pic_info[COMPASS_CHILD_NUM];const struct element_event_handler *handler;//应用层注册的句柄const struct element_luascript_t *lua;
};struct compass_pic_info {struct ui_ctrl_info_head head;u16 cent_x; //旋转中心xu16 cent_y; //旋转中心ystruct ui_image_list *img;
};
表盘
struct ui_watch {struct element elm; //公共属性struct element child_elm[WATCH_CHILD_NUM]; //子控件属性struct watch_css_info child_css[WATCH_CHILD_NUM]; //子控件csschar source[8]; //数据源u8 hour; //时u8 min; //分u8 sec; //秒u8 last_hour; //上一次时u8 last_min; //上一次分 u8 last_sec; //上一次秒u8 updata; //更新标志u8 ctrl_num; //子控件数量u8 sec_cnt; //秒计数,用于匀速表盘计数u8 slow_sec; //匀速表盘使能void *timer; //timeridconst struct layout_info *info;const struct watch_pic_info *pic_info[WATCH_CHILD_NUM];const struct element_event_handler *handler;//应用层注册的句柄const struct element_luascript_t *lua;
};
struct watch_pic_info {struct ui_ctrl_info_head head;u16 cent_x; //旋转中心u16 cent_y; //旋转中心u16 dst_cent_x; //偏移距离u16 dst_cent_y; //偏移距离struct ui_image_list *img;
};struct ui_progress {struct element elm; //公共属性struct element child_elm[PROGRESS_CHILD_NUM]; //子控件属性char source[8]; //数据源u16 center_x; //圆环中心u16 center_y; //圆环中心u16 radius; //圆环半径u16 angle_begin; //起始角度u16 angle_end; //结束角度u8 ctrl_num; //控件数量char percent; //百分比u8 *mask; //不使用u16 mask_len; //不使用void *timer; //不使用const struct layout_info *info;const struct progress_highlight_info *pic_info[PROGRESS_CHILD_NUM];const struct element_event_handler *handler;//应用层注册的句柄const struct element_luascript_t *lua;
};
struct progress_highlight_info {struct ui_ctrl_info_head head;u16 center_x; //圆环中心u16 center_y; //圆环中心u16 radius_big; //外径u16 radius_small; //内径u32 color; //颜色565u16 angle_begin; //起始角度u16 angle_end; //结束角度struct ui_image_list *img;
};struct multiprogress_highlight_info {struct ui_ctrl_info_head head;u16 number;u16 center_x;u16 center_y;u16 radius0_big;u16 radius0_small;u32 color0;u16 radius1_big;u16 radius1_small;u32 color1;u16 radius2_big;u16 radius2_small;u32 color2;u16 angle_begin;u16 angle_end;struct ui_image_list *img;
};
三、控件的显示与隐藏
- 控件
线程同步接口(带刷新)
将页面id post到ui线程调用,先释放原有页面,再加载新页面
int ui_show_main(int id);
int ui_hide_main(int id);
非线程同步接口(带刷新)
需要在ui线程调用,不会主动释放原页面,可以用于多页面同时加载
int ui_show(int id);
int ui_hide(int id);
非线程同步接口(不带刷新)
控件需要在页面内
int ui_core_show(void *_elm, int init);
int ui_core_hide(void *_elm);
动态加载
一般是在init的时候调用,跟随刷新
需要注意父子关系,不能将layout加载到window下面
int create_control_by_id(char *tabfile, int page_id, int id, int parent_id);
int delete_control_by_id(int id);
相关文章:
UI控件使用说明
文章目录 一、控件的公共属性二、常用控件的私有属性三、控件的显示与隐藏 一、控件的公共属性 struct element {u32 highlight: 1; //高亮标志u32 state: 3; //内核记录控件的状态u32 ref: 5; //内核计数值u32 prj: 3; //工程序号u32 hide_action: 1; //HIDE_WI…...
树莓派2安装jupyterlab以便更好的编程体验
树莓派2 是一款很老的开发板了,但是它还能继续战斗。为了更好的编程体验,准备安装jupyterlab 安装jupyterlab 使用命令: pip install jupyterlab 该过程非常漫长,因为树莓派2是很老的板子,它需要安装一些arm7版本的…...

计算机网络常见面试题总结(上)
计算机网络基础 网络分层模型 OSI 七层模型是什么?每一层的作用是什么? OSI 七层模型 是国际标准化组织提出的一个网络分层模型,其大体结构以及每一层提供的功能如下图所示: 每一层都专注做一件事情,并且每一层都需…...
k8s 亲和性之Affinity
文章目录 1. Node Affinity(节点亲和性)节点亲和性类型配置示例常见场景: 2. Pod Affinity 和 Pod Anti-AffinityPod Affinity 配置示例Pod Anti-Affinity 配置示例常见场景: 3. 亲和性规则概述4. 亲和性和反亲和性的细节5. 亲和性…...

SpringBoot 插件化开发模式
一、前言 1.1 使用插件的好处 1.1.1 模块解耦 实现服务模块之间解耦的方式有很多,但是插件来说,其解耦的程度似乎更高,而且更灵活,可定制化、个性化更好。 举例来说,代码中可以使用设计模式来选择使用哪种方式发送…...

基于树莓派的安保巡逻机器人--项目介绍
目录 一、项目简介 二、项目背景 三、作品研发技术方案 作品主要内容: 方案的科学性 设计的合理性 四、作品创新性及特点 五、作品自我评价 本篇为项目“基于树莓派的安保巡逻机器人”介绍博客 演示视频链接: 基于树莓派的安保巡逻机器人_音游…...
Python学习笔记8-函数1
自定义函数 def 函数名(形参):函数体return 空/变量/对象/表达式 形参:函数定义时声明的参数实参:函数调用时传入的参数。函数只需要定义一次,就可以被多次使用当函数被调用时,才执行函数体,定义时不执行 文档注释 …...

如何使用ST7789展现图片?[ESP--4]
本节我们继续ESP和ST 7789的话题,这节课我们来学学如何展示图片,话不多说,先上效果 好,教程开始~前情提要,要看懂这篇,建议搭配楼主的前两期文章 使用ESP32驱动LCD-ST7789屏幕[ESP–2] 加速你的LCD-ST7789屏幕…...
【QNX+Android虚拟化方案】129 - USB眼图参数配置
【QNX+Android虚拟化方案】129 - USB眼图参数配置 1. 软件侧dts如何配置眼图参数 及 其对应关系2. 硬件 QNX 侧调试眼图命令2.1 High Speed USB2.0 Host2.2 Super Speed USB3.0 Host3. 硬件 Android 侧调试眼图命令基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不…...

【机器学习】探索机器学习决策树算法的奥秘
决策树 前言基本概念常见的决策树算法ID3算法C4.5算法CART算法 决策树的优缺点应用场景决策树的可视化总结 前言 在当今这个数据驱动的时代,机器学习作为数据分析与预测的利器,正以前所未有的速度改变着我们的生活和工作方式。在众多机器学习算法中&…...

K8S版本和istio版本的对照关系
版本对照关系 下载地址1 下载地址2...

嵌入式硬件实战提升篇(三)商用量产电源设计方案 三路电源输入设计 电源管理 多输入供电自动管理 DCDC降压
引言:本文你能实际的了解到实战量产产品中电源架构设计的要求和过程,并且从实际实践出发搞懂电源架构系统,你也可以模仿此架构抄板到你自己的项目,并结合硬件篇之前的项目以及理论形成正真的三路电源输入设计与开发板电源架构块供…...
【机器学习】机器学习的基本分类-监督学习-逻辑回归-Sigmoid 函数
Sigmoid 函数是一种常用的激活函数,尤其在神经网络和逻辑回归中扮演重要角色。它将输入的实数映射到区间 (0, 1),形状类似于字母 "S"。 1. 定义与公式 Sigmoid 函数的公式为: 特点 输出范围:(0, 1),适合用…...

EasyDarwin搭建直播推流服务
学习链接 easydarwin官网 - 这里看介绍 easydarwin软件下载地址 - 百度网盘 easydarwin视频 B站 文章目录 学习链接使用下载EasyDarwin压缩包,并解压到目录启动EasyDarwin点播直播easyplayer.jsapidocffmpeg推流rtsp & ffplay拉流 使用 下载EasyDarwin压缩包…...

无人机数据处理系统:原理与核心系统
一、数据处理系统的运行原理 数据获取:无人机在飞行过程中,通过搭载的传感器(如相机、激光雷达等)采集到各种类型的数据,例如图像、点云等。这些数据是后续处理和分析的基础。 数据传输:采集到的数据会通…...

DLL中的inline static成员变量:Windows开发中的常见陷阱
在Windows平台进行C开发时,DLL(动态链接库)是一个非常重要的概念。它让我们能够实现代码的模块化和动态加载,提高了程序的灵活性和维护性。然而,当我们在DLL中使用C17引入的inline static成员变量时,可能会…...
pandas 读写excel
在Python中,使用Pandas库读写Excel文件是一个常见的操作。Pandas提供了read_excel和to_excel方法来分别实现读取和写入Excel文件的功能。以下是一些基本的示例: ### 读取Excel文件 python import pandas as pd # 读取Excel文件 df pd.read_excel(pat…...
记录Threadlocal使用
编写ThreadLocal工具类 package com.jjking.jplan.context;public class BaseContext<T> {public static final ThreadLocal threadLocal new ThreadLocal();//存储用户public static void set(Object t) {threadLocal.set(t);}//获取用户public static <T> T ge…...

2024 ccpc 辽宁省赛 E(构造 思维?)L(二分+一点点数论知识?)
E 题意: 可以注意到: 我的两种方格都四个方格的大小。 所以 如果存在一种摆放方式 那么 4|nm。 再考虑一种特殊的情况 22 ,此时虽然我的积是4 但是无法摆放的。 1>对于 4 | n,或者 4 | m.我直接摆放第二种方格就可以了。 如果我n 是4 的…...

【iOS】设计模式的六大原则
【iOS】设计模式的六大原则 文章目录 【iOS】设计模式的六大原则前言开闭原则——OCP单一职能原则——SRP里氏替换原则——LSP依赖倒置原则——DLP接口隔离原则——ISP迪米特法则——LoD小结 前言 笔者这段时间看了一下有关于设计模式的七大原则,下面代码示例均为OC…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

Gitlab + Jenkins 实现 CICD
CICD 是持续集成(Continuous Integration, CI)和持续交付/部署(Continuous Delivery/Deployment, CD)的缩写,是现代软件开发中的一种自动化流程实践。下面介绍 Web 项目如何在代码提交到 Gitlab 后,自动发布…...
结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案
以下是一个结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案,包含完整数学推导、PyTorch/TensorFlow双框架实现代码及对比实验分析。 基于PINN的反应扩散方程稀疏数据预测与大规模数据泛化能力研究 1. 问题定义与数学模型 1.1 反应扩散方程 考虑标…...
从0开始一篇文章学习Nginx
Nginx服务 HTTP介绍 ## HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 ## HTTP工作在 TCP/IP协议体系中的TCP协议上&#…...
Mac版Visual Studio Code Copilot 无法使用的解决方法
1 app文件夹删除Visual Studio Code 2 终端里面 输入以下指令,删除各种缓存 rm -fr ~/Library/Preferences/com.microsoft.VSCode.helper.plist rm -fr ~/Library/Preferences/com.microsoft.VSCode.plist rm -fr ~/Library/Caches/com.microsoft.VSCode rm -f…...
OD 算法题 B卷【水果摊小买卖】
文章目录 水果摊小买卖 水果摊小买卖 小王手里有点闲钱,想做点水果买卖,给出两个数组m, n, m[i]表示第i个水果的成本价,n[i]表示第i个水果能卖出的价格;假如现在有本钱k,试问最后最多能赚多少钱࿱…...

Android端口转发
如上图所示,有一个Android设备,Android设备里面有主板,主板上有网络接口和Wi-Fi,网络接口通过网线连接了一个网络摄像头,这就跟电脑一样,电脑即可以通过网线接入一个网络,也可以同时用Wi-Fi接入…...