思维碎片
提示
盘古 OS
的设计仍在逐步改进与完善中,本文将随时发生变化,感兴趣的朋友们可以时刻保持关注;- 在下方的版权声明中有本文作者的联系方式,有不同意见和相关建议的朋友可以与其保持联系;
- 也可在本文底部的评论区登录 Github 后,直接发表您的观点;
版权声明
- 文章作者: flytreeleft - flytreeleft@crazydan.org
- 文章链接: https://studio.crazydan.org/docs/pangu-os/ui-design/thoughts
- 版权声明: 本文章采用许可协议《署名 4.0 国际 (CC BY 4.0)》。 转载或商用请注明来自 Crazydan Studio!
函数化 GUI
- 设计器自举:可通过设计器设计出设计器
- 目的:让开发专注于数据结构及其更新逻辑,让设计专注于页面设计以及用户交互,且设计与开发的工作可协调实施,二者的劳动成果共享,而不是重复画页面;方便维护模型与函数,视图与模型,视图与逻辑之间的联动关系,无需确定函数名称,参数类型等,减少记忆负担,降低出错率,提高开发速度,方便程序维护;
- 通过手绘方式识别出并实时转换为 ui 元素:设计组件时,先在一个画板中绘制,绘制完成后拖动到设计器的设计区域,再对绘制的元素做细化调整;页面布局则直接手绘并即时转换;
- 分层:每个浮于其他组件之上的组件,都放在新的层上,且层与层为树形结构,在哪一层的组件之上浮动,就作为哪一层的子层
- 网格布局:将页面横向分为 36,72,128 等尺寸的格子,组件尺寸、组件间隔等均为网格尺寸的整数倍,最终布局根据实际的网格尺寸做流式布局。每层均可设置为不同的细分网格,默认为父层配置
- 从结构化数据生成 UI,函数化动作和处理逻辑
- 数据包括业务状态和视图状态,业务状态影响视图状态,视图事件触发对业务状态和视图状态的更新
- 视图是函数创建的,视图事件也是触发的函数
- 状态是向下传递的,消息是向上传递的
- 视图状态除数据外,也包括视图函数,可以在视图函数内包含组件的内部状态,在内部状态更新时,闭包的视图函数也需要更新(更新的是函数引用,函数返回的是更新后的内部状态),从而使得状态树发生更新,进而实现对视图的更新。或者,组件内部状态,由组件自动挂载至全局状态树,并由其维护和更新
- 能够确切地知道页面中所有元素就绪的时间,并可触发监听:组件都发送就绪事件。引擎是能够知道以组件为单位的渲染起止时间的
- 组件边缘可配置变化的样式和触发的事件,实现拖动、滚动、缩放等操作
- 桌面自身就是视窗容器。基础组件即为容器,无形状,无边界,只有从属,可以通过样式,从视觉上感知其边界范围。统一管理和查看隐藏和透明窗口,以消除安全隐患。
- 一个好的设计,绝不应该在极端场景下,还要求用户保持头脑清晰,否则就会撞车;而是要尽可能地避免或者减少用户犯错的任何可能!当你习惯了只用一个踏板车辆就会停下来的时候,紧要关头你可能还是只想着那一个踏板。
- 框定产生布局
- 无干扰设计,设计元素和配置面板通过快捷键或者鼠标点击呼出
- 按照新操作系统的机制进行设计,函数化所有内容,页面生成逻辑都在后端
- 协作开发:设计做页面和交互,开发做接口和数据绑定
- 以函数或 DSL 做页面描述,具体展示实现可随意替换
- 沙盒机制;独立的页面运行环境;可控制页面可访问的资源操作函数;
- 对高级用户可一对一开放设计器自举功能,个性化设计器本身但互不干扰,可自行定制 UI,集成外部接口等
- 设计器代码需被混淆和加密,确保不会被逆向工程
- 未付费页面加水印和版权声明,代码被混淆和加密;付费用户可查看所设计页面的源码并去掉版权声明;不需要免费套餐;
- 在用户授权的情况下,为设计者申请独立著作权或代理著作权,避免被他人抄袭,保护设计者权益
- 用户可以修改或设计自己喜欢的设计器界面并使用,实现千人千面
- 模型属性变化引起视图的变化,视图状态与模型属性绑定(存在无绑定的情况)
- 先根据数据的最终状态确定和切换组件的状态,再确定以哪些方式更新数据的状态,也就是,组件状态由数据的状态决定,而无需关注数据状态在何时以何种方式发生变化
- 组成系统:布局,样式,动画,事件(交互)
- 组件可设计,设计器可设计,页面可设计,动画可设计,逻辑可设计,
- 不是视觉上在一起的才是一个组件,一个组件的不同部分可以在布局上分离,只要相互之间的状态是联动的,便可以构成一个组件
- 加强触感和声音反馈,视觉反馈有时感知太弱
- 未提交表单自动暂存,因误操作导致退出再重新进入后依然可以继续编辑,也可提供草稿箱,供随时重新编辑
- 支持可逆计算
- 数据驱动
- 配色动态计算
- 函数创建的视图可任意嵌入其他函数的视图中(布局与配色自动融合),也可以以独立窗口形式展示
- 应用视图包含布局树,样式树,动画树,模型树。各节点均可有唯一坐标。模型与视图的局部或整体进行联动,从聚合根出发渲染视图,可以有多个聚合根,且相互间可存在引用
- 组件根据其结构生成唯一标识,以支持全局复用,并按需下载组件
- 不能直接修改视图树,只能通过函数返回带定位坐标和差量的计算结果,由引擎运算差量后再执行变更
- 对各类树的修改均采用差量机制,通过逻辑函数返回差量
- 当前大部分的组件库只是样式不同,但交互逻辑是基本相同的,因此,样式可以以差量形式独立出来
- 需要降低布局结构的层级,尽量展平,以降低布局结构间的差异
- css 样式的定义本质上也是在做差量运算,其选择器就是在定位节点,不过,其可以定位一组节点
- 内置组件和自定义组件均有自己的状态,状态放在组件的属性上,属性均为有类型和结构的,不仅仅是字符串
- 组件有状态,可触发事件。触发事件就是调用事件绑定的监听
- 组件通过函数定义,接受状态和事件监听,返回视图结构
- 组件内部使用事件,应用层面使用消息:参考 Elm 框架设计
- 图片等对象数据以 hash 为唯一索引,用于缓存和去重
- 函数生成页面布局和样式的 AST 树,再由渲染器渲染
参考资料
- Astro: 内容驱动的前端框架,服务端渲染,尽可能不使用 JS,动态部分以 群岛 机制实现按需加载
- Radix UI: 无样式 UI(仅需关注组件的嵌套结构),强调组件的原子性和组合性,提供了组合函数, 允许将多个组件的行为合并到一起
- 如果给你一次重新设计 HTML 和 CSS 的机会,你会怎么做?: 直接传输页面的 AST 结构,避免字符串解析,提升解析效率和安全性
- 如果给你一次重新设计 HTML 和 CSS 的机会,你会怎么做?: 界面绘制的一等公民是代码,包括 layout、paint 在内的功能均以代码为最原始的入口; xml/html/css 之类的配置文件作为二等公民,在代码中实现相应的构建器,将配置文件翻译为代码逻辑; 绘制遵循严格的嵌套关系,子窗口区域内的绘制只能影响它本身和它的子窗口;