简陋的编年史:布局

2022-02-22 17:03:38

这是第二篇文章,记录了开发Humble UI(Clojure UI框架)的过程。在这篇文章中,我们将讨论简单的UI布局方法。

这些决定都不是完整的或最终的,可能随时会改变。这些帖子的主要目的是分享想法,更好地理解什么可行,什么不行。欢迎反馈!

屏幕之间的逻辑大小保持不变,物理大小取决于像素密度和操作系统设置。

通过将逻辑像素乘以UI比例,将其转换为物理像素。老式的1080p屏幕通常使用1.0的用户界面比例。视网膜屏幕使用2.0的用户界面比例。对于Windows和Linux,UI规模可以是任何数字:1、1.25、1.5、1.75、2、2.5都是合理的UI规模。

默认情况下,UI比例设置为OS设置,但也可以任意调整。

所以在简陋的UI中可能没有20.5物理px按钮,但20.5逻辑px为什么不呢?只要物理结果符合物理像素网格,我们很高兴:

UI比例不是硬编码的数字,不必匹配操作系统设置,Humble UI中的所有内容都具有比例意识,可以以任何比例呈现。

默认情况下,它用于匹配操作系统设置,但也可用于轻松缩放每个窗口的用户界面:

Draw调用是自上而下的:从最外层的容器开始,我们划分空间,并要求内部组件填充它。

度量是自下而上的:如果你想度量一个容器,它会让它的子容器自己度量,然后结合结果。

如果你把一个按钮直接放进一个窗口,它会填满整个窗口:

在引擎盖下,一个窗口将只要求按钮使用已知的窗口大小绘制:

或者,如果使用“对齐”将按钮包裹在中间,情况会发生变化:

align将转换画布,然后要求按钮绘制,但要使用之前确定的大小。

到目前为止,这个模型已经被证明是足够的,我们将看到随着谦逊用户界面的发展,它能处理多少。

一开始,按钮延伸到整个窗口可能听起来有悖常理,但如果你仔细想想,这是唯一合乎逻辑的做法:容器中的按钮没有任何其他东西,必须填满整个容器。

现在,如果您想要不同的行为,您必须进一步指定它。你想让它对准左上角吗?左中?中心拉伸?所有这些听起来都不是一个明显的默认值,所以您必须明确地添加它。

与设置或修改器相比,Humble UI更喜欢小型的单一用途组件,因为它们往往组合得更好。

例如,按钮上没有将其宽度设置为300px的设置,但有一个宽度组件可以将宽度设置为它包含的任何子项。垂直/水平对齐、填充等也一样。

基本上你会添加越来越多的东西,直到你得到你想要的。不喜欢某样东西,或者想做一些不同的事情?拆下、更换、添加,所有这些都不需要修改组件本身。

看起来有点冗长,但希望这种方法比CSS更“简单而不容易”,更容易理解。

棘手的部分是找出一个实际结合良好的模型。在不同的阶段,我看到组件在预期的地方拉伸或不拉伸,halign不能嵌套在valign中,反之亦然,halign不能在column/valign inside row中工作,以及许多其他情况。

但一切都很好,结局也很好,我对我们现在的处境感到高兴:

如果你试图用文字来描述它,你会说“配置文件图片、配置文件链接和注销链接,组件之间有10像素”。

我们认为10px的间距是它自己的东西,是布局的一部分,而不是组件的一部分。我们不说“10像素右边缘的个人资料图片”,因为这不是我们的想法。

然而,在CSS中,在组件之间添加间距的方法是修改组件本身,添加右边距,如下所示:

有余量的组件很难重复使用。这是因为利润只有在特定的环境下才有意义。它们属于容器,而不是组件。

第一个/最后一个组件需要特殊处理,因为您不需要额外的10个像素。

组件之间的空间自然不属于其中一个。这是他们之间的事。

间隙非常大,因为它们是简单的东西,可以添加到布局中,而不是修改现有组件。从逻辑上讲,他们和其他容器孩子生活在同一个水平上,这就是他们所属的地方。

它们也很容易使用,并且有一个简单的概念模型:它们只是块,就像任何其他块一样。

Align的想法是从Flatter中偷来的,唯一的区别是我将水平和垂直对齐分割为两个独立的组件。

要对齐容器内的某个对象,需要指定两个数字:子对象宽度的百分比和容器宽度的百分比。

这款车型的酷之处在于,它提供了所有常见的对齐模式:

如果你读过我对字体构造的深入研究,你就会知道我不喜欢现在网络上文本的对齐方式。简陋的用户界面让人觉得是重新审视它、改善现状的好时机。

简而言之,简陋用户界面中的文本边界是由基线和封顶高度定义的,而不是由上升/下降/em square或任何其他任意单位定义的。

但是等等,上升者/下降者呢?它们将在边界框外渲染?是的,他们会:

我不认为这是一个问题,因为大多数时候你在文本块周围添加了额外的填充。

还记得CSS中的calc吗?在简陋的UI中也可以做类似的事情,但使用简单的Clojure代码:

(ui/width#(>;(:width%)(((*3填充))(/2)(+padding))(按钮和#34;C和#34;颜色清晰))

我还缺什么吗?你有什么意见吗?一定要让我知道!

我还创建了开源软件:Fira代码、AnyBar、DataScript和Rum。如果你喜欢我所做的,并且想尽早获得我的文章(以及其他好处),你应该在Patreon上支持我。