如果能为子节点加入“避免参与Layout计算”的功能就好了

如果能为子节点加入“避免参与Layout计算”的功能就好了。
很多动态大小的框框,都因为没有这个功能,需要编写一些额外重复代码。

1赞

可以加空节点。size为0.然后你有什么东西可以放到这个空节点里。反正layout只管一级子节点。

哈哈,我就是这么做的。在对于有间隔的layout里面,我甚至把这个“空节点”设置负的高度或者宽度用来抵消它带来的间隔。但是,好丑啊

用空节点比较好,否则我们还要增加一个 LayoutItem 组件,挂上去唯一的作用是设置避免参与计算?感觉很多余。

是的。但不是LayoutItem,而是SkipLayoutItem,这样不破坏原有的被大家熟知的用法。
(它的地位说它多余,但是应该也没有 BlockInput 那个东西多余,在知道它之前,我一直使用一个Button)

再说说“空节点”的缺点:
主要是它的位置被layout破坏了,而经常的,它需要独立的锚定在父节点中心,或者跟父级一样大,或者widget到父节点的一个角落上做个返回按钮之类,总之只被自身的widget所决定就好了。

说到这里,突然发现如果能在widget上面增加一个设置:bool标记为 skiplayout也就够了。layout会自动剔除带有开启了skiplayout的widget的子节点也就结了。

1赞

何时须要锚定父节点的东西在 layout 中,能给个更具体点的案例吗?

先举个目前在做的简单例子:
image
第一个例子:
文字label是 resizeheight的,layout是带透明底的圆角框,由于是layout,会随着label的高度自动变化高度。此时那个叉叉按钮就像锚在layout节点右上角,并且也在layout里面但不受layout排布影响位置。
第二个例子,还是上面的图:
另外如果圆角框是美术的两个素材:一个白边框,一个透明黑底,那么可以用透明黑底放layout层,白框在layout节点中锚定4个边拉伸但不能受到layout逻辑进行位置排布。

总之,需要放在layout节点内,而又需要使用自己的widget相对父层级或其它节点进行锚定的时候,就会需要用到忽略父节点layout的逻辑。

当然了,以上这些东西用空节点,或者代码去影响一下也不是不可以,但如果有这个功能的话会非常方便。

TextPanel 节点是layout 纵向 container 模式,如果里面只有一个content节点(label)那么直接就变化高度了。而里面的panelFill是透明底,panelBorder是边,xxxbutton就是右上角的按钮。它们就可以自由锚定TextPanel的的边框了。
我记得之前还有不少案例,有一些是由于跟透明度可以递归管理相关,如果拥有这个功能会简化节点层次或者减少代码。

SkipLayout - 个人感觉让子节点知道自己在 Layout 中, 是一种强耦合. 并且为了满足少量需求使实现复杂化并不划算.

我自己是写了个 WrapperLayout - 只根据 children[0] 来 resize 自身, 不受后续 child 影响.

题外的一个问题,H5 Android上的这段文字让label的高度比其它平台要高出不少(大概60个设计像素)我只好特殊处理了,这是不是也不太正常?

看到了 children[0] ,我瞬间就能明白你的意思了,挺好。不过有时有也需要children[n],把0层垫在下面做一些东西。

“SkipLayout - 个人感觉让子节点知道自己在 Layout 中, 是一种强耦合. ”那就可以实现成另一种,widget内的一个标记(既然widget内都能有个不怎么用的target,或者发现target指向了这个layout,则进行skip,多美。。)

1赞

:smile:. 一开始我也想了很多, 还加了 @property targetChild …之类的, 结果发现代码行数加倍还可能有没考虑到的问题… 不如满足大多数简单情况就好. 特殊情况特殊考虑.

实际上我的另一个 自定义 Layout 就是这样, 如果有 Widget, 就跳过…

其实有你来回复,不就说明这的确是个需求啊。
不过显得我比较懒,总想着别人喂。 :sweat_smile:

其实有的widget还真的可以一起用,不能跳过的 。比如layout管高,widget锚宽。

ScrollView 中很常见的情况对吧.

我的意思是, 特殊情况特殊设计, 官方只需提供简单可靠的基石. 功能越多, bug 越多.

是的。那大大们先别管这个功能了,还是自己来吧。
我在3.6.1就有收获新bug。

明白了,谢谢反馈!

最近有空把我所说的功能给实现了。
建立了一个LayoutEx文件,继承于Layout。
LayoutEx.rar (1.9 KB)


父层级layout节点挂LayoutEx。子层级layout-001节点上挂Widget,并且target指向父节点layout即可。
父节点layout排版了 前进+横向+后退 三个节点,跳过了layout-001不处理。
而layout自身排布设置好左右节点之后,手动或者使用widget定位到中心即可。
代码中就是override 一下 _checkUsefulObj,_doLayoutVertically,_doLayoutHorizontally三个方法,
里面遍历子节点是跳过条件:当子节点中含有Widget.target为本身的节点。

if (child.getComponent(Widget)?.target == this.node) continue;
2赞