2.3版本canvas和widget的问题

这是官方文档说明:


这是我的配置:

这是我的输出代码:

这是我的运行结果:

既然我加了widget,为啥输出的尺寸还是设计分辨率的尺寸?从这运行结果可以看出,height明显比width大很多。

用cc.winSize试试

我是自已写了个组件对齐cc.winSize

各位没明白我的意思,我是想知道这个widget在这里到底发挥了啥作用,如果按照官方文档里所说的,canvas用来缩放,widget用来修改尺寸,那下面这个例子我更不知道作何解释?

运行结果为


为啥widget明明设置了屏幕上下铺满,为啥实际屏幕上下这么大空?

哦,真的没看清楚,因为Widget我没放在Canvas上过,
通常是放在别的Node,然後不设定时它预设对齐父节点

我们上面讲的情况是,
当Canvas设定保持高度时,
在特殊机型上会出现宽度不足覆盖全屏
才会需要用到cc.winSize

看来需要at官方人员来询问一下

我这边使用官方 2.3 测出来结果是正常的,你是否定制了引擎?请检查你的场景设置?或者 Widget 改为 always 模式看看?

这么晚还在?辛苦了

没想到2.3.0居然对Canvas动手了。。。之前改了适配模式,这次也动Canvas节点的对齐了。
现在的适配过程应该是先按适配模式调整了visible rect的尺寸(对应屏幕分辨率的viewport):


然后再根据visible rect的尺寸,使用Canvas节点中的Widget组件来拉伸该节点至visible rect大小:

第一步修改visible rect是没有变的,第二步是将原来对齐Canvas节点的逻辑转到了用Widget去实现。要知道,之前Canvas对齐的逻辑也和四周对齐的:

所以,总结一下就是,2.3.0中将Canvas节点的对齐效果还是一样的,只是提取到用Widget实现了。对齐的目标还是visible rect。
你举的这个例子是因为你选了Show All模式,这时visible rect的比例仍然是设计分辨率的比例:

这时,Canvas节点以visible rect对齐的话,是会出现屏幕上下留黑边的。

1赞

我个人觉得Canvas节点的对齐逻辑还是之前那种更好,因为把这部分逻辑放到Widget中去之后,开发者会比较纳闷,Canvas还能向哪个target对齐?其父节点?其父节点是Scene,不好意思,Scene节点的size是0。只有查看一下源码才知道Widget对于向Scene对齐的节点是按visible rect对齐的。
如果实在有那种需要Canvas节点保持设计分辨率的场景,不如就让开发者单独建一个节点向设计分辨率对齐,然后按照该节点去对齐其他节点。

谢谢大大的分析。这部分行为应该是和旧版本保持不变的,从旧版本的源码可以看到,Canvas.alignWithScreen 中,不论是哪种适配模式,Canvas node 的尺寸都是等同于 visibleRect 的,和目前 Widget 的对齐行为一致。

这部分确实是我们文档做得不够好的地方。我们希望开发者尽可能清楚 widget 的这个机制,这样可以做出更灵活的场景结构,不需要把所有东西放在 Canvas 下面。

那样设计分辨率如果被改变了,这个节点所保持的宽高就错了。我们希望尽量能够保持数据来源只有一份,而不需要开发者手动去同步设计分辨率、节点之间的尺寸变化。