如果能为子节点加入“避免参与Layout计算”的功能就好了。
很多动态大小的框框,都因为没有这个功能,需要编写一些额外重复代码。
可以加空节点。size为0.然后你有什么东西可以放到这个空节点里。反正layout只管一级子节点。
哈哈,我就是这么做的。在对于有间隔的layout里面,我甚至把这个“空节点”设置负的高度或者宽度用来抵消它带来的间隔。但是,好丑啊
用空节点比较好,否则我们还要增加一个 LayoutItem 组件,挂上去唯一的作用是设置避免参与计算?感觉很多余。
是的。但不是LayoutItem,而是SkipLayoutItem,这样不破坏原有的被大家熟知的用法。
(它的地位说它多余,但是应该也没有 BlockInput 那个东西多余,在知道它之前,我一直使用一个Button)
再说说“空节点”的缺点:
主要是它的位置被layout破坏了,而经常的,它需要独立的锚定在父节点中心,或者跟父级一样大,或者widget到父节点的一个角落上做个返回按钮之类,总之只被自身的widget所决定就好了。
说到这里,突然发现如果能在widget上面增加一个设置:bool标记为 skiplayout也就够了。layout会自动剔除带有开启了skiplayout的widget的子节点也就结了。
何时须要锚定父节点的东西在 layout 中,能给个更具体点的案例吗?
先举个目前在做的简单例子:

第一个例子:
文字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,多美。。)
. 一开始我也想了很多, 还加了 @property targetChild …之类的, 结果发现代码行数加倍还可能有没考虑到的问题… 不如满足大多数简单情况就好. 特殊情况特殊考虑.
实际上我的另一个 自定义 Layout 就是这样, 如果有 Widget, 就跳过…
其实有你来回复,不就说明这的确是个需求啊。
不过显得我比较懒,总想着别人喂。 
其实有的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;

