递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 3036|回复: 21
打印 上一主题 下一主题

[其它] 【记录贴】我的 bmGui 框架(二)

[复制链接]

113

主题

693

帖子

4376

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4376
跳转到指定楼层
楼主
发表于 2024-9-2 01:56:07 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 kamikaze 于 2024-9-2 22:42 编辑

这次,我想应该简要的介绍一下我的 bmGui 框架

bmGui 框架,其中 GuiElement(元素)是框架的基础,也是核心
同时也是 GuiWindow(窗口)、GuiWidget(部件)的父类

GuiWindow 分层窗口
简单来说,支持透明、异形、拉伸等等

GuiWidget 其他控件的父类
在我的初步设计中,所有的控件继承自 GuiWidget (已实现 按钮、单选框、多选框等等)

GuiElement 元素
因为 GuiWindow、GuiWidget 作为其子类,所以基本继承 GuiElement 所有属性和函数


一、盒子模型
每个元素都存在以下属性
1、X、Y 元素左上角的位置
2、Width、Height 元素的宽高
3、Margin(外边距)
4、BorderWidth(边框宽度)
5、Padding(内边距)
6、BorderRadius(边框圆角)

其中,Width、Height 分别支持设置 3 种值类型(GuiValue 类)
① Int 整数
② Percent 百分比,父元素的宽高百分比
③ FitContent 内容自适应,该元素尺寸由子元素决定

类比上古时代 MFC 和 经典 WebUI,内容自适应其实是一种非常好用且必要的尺寸策略


BorderRadius 支持设置 4 个角度、8 个半径,2 种值类型(GuiValue 类)
比如 topLeft.x、topLeft.y、topRight.x、topRight.y …
① Int 整数
② Percent 百分比,该元素的宽高百分比
比如该元素宽度为 300px,设置 BorderRadius.topLeft.x 为 50pct,在计算盒子模型时 topLeft.x = 150px


二、布局类型
在记录贴(一),我已经简要的介绍了布局类型
包括 Column(垂直布局)、Row(水平布局 )、Box(类型安卓中的帧布局)



该布局方式参考自谷歌近年来新的 Compose 布局,并非我闭门造车,所以实用性应该很强
这里有个知识点,在 Column 和 Row 中,还有两个属性,分别是 MainAxis(主轴)和 CrossAxis(交叉轴,也可以理解为副轴)

不难想象,Column(垂直布局),其主轴纵向垂直,交叉轴(副轴)横向水平
Row(水平布局),其主轴横向水平,交叉轴(副轴)纵向垂直
具体为什么要区分 MainAxis(主轴)和 CrossAxis(交叉轴),后面我会讲解

Column 和 Row 两种布局方式,不支持设置 X、Y
简单来说,这两种布局方式,所有子元素按主轴或交叉轴对齐方式依次排列
因此 X、Y 是该框架自行计算的,所以此时 设置 X、Y 无效

Box 布局方式,不支持设置 Margin(外边距)
该布局方式,需要自行指定距离父元素的 X、Y,所以此时设置 Margin 无效(和 Web 所有区别)

再来说 MainAxis(主轴)和 CrossAxis(交叉轴)
MainAxis 支持 Start、Center、End、SpaceBetween、SpaceAround
CrossAxis 支持 Start、Center、End
具体样式,可自行了解
贴心传送门 Compose 中的流式布局  |  Android Developers (google.cn)

经过思考,我认为参考 Web 布局,还应该设计添加一种 Float 浮动布局,这个坑以后再填

三、阴影效果
每个元素都支持添加多个阴影,其属性与 Web 相似
包括 offsetX(横向偏移量)、offsetY(纵向偏移量)、blur(模糊半径)、color(阴影颜色)、isEraseObscuredPart(是否擦除被遮挡的部分)

因为 Window(窗口)继承自元素,所以窗口当然支持阴影
简单的看了一下,其他前辈的自研 UI框架,并没有深入研究(此话不负责~)
有的窗口阴影还是通过图片实现的,整体效果和逻辑肯定要稍差一些了

在阴影这个属性上,窗口做了一些特殊处理,不支持 offsetX(横向偏移量)、offsetY(纵向偏移量)
且仅支持添加一个阴影效果,为什么这样处理,这应该很容易理解吧~

再说一下 isEraseObscuredPart(是否擦除被遮挡的部分) 这个参数,当我们窗口或部件为半透明时,
如果不擦除阴影被该元素遮挡的部分,很影响视觉效果,但如果每个都擦除,又会造成不必要的开销,所以添加此参数

……

坐久了腰疼,有机会再和大家交流:噜阿噜

【记录贴】我的 bmGui 框架(一) - 核心用户服务 - 递归火山软件开发平台 - Powered by Discuz! (voldp.com)

QQ 89075309
回复

使用道具 举报

444

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
40517
22#
发表于 2024-9-23 23:11:15 | 只看该作者
K大,什么时候出测试版,出火山例子吗?
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

113

主题

693

帖子

4376

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4376
21#
 楼主| 发表于 2024-9-3 19:21:58 | 只看该作者
轻机 发表于 2024-9-3 17:37
自适应组件、圆角组件、丰富的列表框、透明组件。有了这几个就完美

已经有啦
QQ 89075309
回复

使用道具 举报

0

主题

4

帖子

166

积分

注册会员

Rank: 2

积分
166
20#
发表于 2024-9-3 17:37:41 | 只看该作者
自适应组件、圆角组件、丰富的列表框、透明组件。有了这几个就完美
回复

使用道具 举报

3

主题

112

帖子

349

积分

中级会员

Rank: 3Rank: 3

积分
349
19#
发表于 2024-9-3 11:28:33 | 只看该作者
怎么删除呢
回复

使用道具 举报

3

主题

112

帖子

349

积分

中级会员

Rank: 3Rank: 3

积分
349
18#
发表于 2024-9-3 11:26:59 | 只看该作者
不好意思。发错了消息
回复

使用道具 举报

3

主题

112

帖子

349

积分

中级会员

Rank: 3Rank: 3

积分
349
17#
发表于 2024-9-3 11:10:32 | 只看该作者
还是很难啊
回复

使用道具 举报

3

主题

112

帖子

349

积分

中级会员

Rank: 3Rank: 3

积分
349
16#
发表于 2024-9-3 10:59:11 | 只看该作者
我可以尝试着去做
回复

使用道具 举报

3

主题

112

帖子

349

积分

中级会员

Rank: 3Rank: 3

积分
349
15#
发表于 2024-9-3 10:55:02 | 只看该作者
这个框架很难!!!!
回复

使用道具 举报

3

主题

112

帖子

349

积分

中级会员

Rank: 3Rank: 3

积分
349
14#
发表于 2024-9-3 10:51:47 | 只看该作者
哈哈哈!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-23 06:16 , Processed in 0.094611 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表