如果要用代码控制一个在相对布局Panel里的UI控件的Position位置,那么只能用修改其LayoutParameter的方法才行,普通的setPosition()不起作用:
node:getLayoutParameter():setMargin({ left = 0,right = 0,top = 0,bottom = 0})
注意,必须是调用setMargin()方法才行,而像getMargin().left = 0
这样的写法是不起作用的
修改LayoutParameter的margin虽然能够重新定位UI控件了,但如果要给这个UI控件的移动做一个动画的话还是不行,因为MoveTo Action的本质还是设置position值。解决办法只能是在Cocos Studio里将Panel设置为绝对定位而不是相对定位了。
工作流程是:
- 在Cocos Studio里创建相对定位的Panel和里面的UI控件
- 一切都定位好后,将上层Panel重新设置为绝对定位,此时里面的UI控件不会错乱,position数值会被Cocos Studio自动算好
- 在代码里对UI控件用setPosition()定位、用MoveTo做动画都没问题
之所以这么绕,是因为cocos2d-x动画的动作必须是事先指定好的(如MoveTo、ScaleBy等),而不像UIKit的[UIView animationWithDuration:...]方法那么聪明,能够自动识别所有绘画层的变化。
总结:相对定位的控件没法做基于Position位置的动画,必须改为绝对定位。在不用百分比做多分辨率适配的情况下,一般在Cocos Studio里先用相对定位设置好控件位置,再改回绝对定位也不会有什么问题。(我没试过如果用百分比做多分辨率适配再改回绝对定位会不会有问题。)