组件添加位置控制器选中使用百分比记录坐标的问题

组件添加位置控制器选中使用百分比记录坐标的问题

this._view = fgui.UIPackage.createObject("main", "mainview").asCom;
this._view.makeFullScreen();
this.c1 = this._view.getController("c1");
fgui.GRoot.inst.addChild(this._view);
创建一个组件面板,设置和屏幕宽高一样,里面有个按钮,增加控制器,为按钮添加位置控制器(控制器page0和page1对应的按钮位置都是一样的),选中使用百分比记录坐标
当当前舞台的宽高和组件的宽高不一样的时候,第一次切换控制器,会出现按钮位置跳动,下一次再切换到当前控制器的selectindex时候,就不会跳动了,检查了下源码发现:
当createObject创建组件的时候,里面的按钮执行了GearXY里面apply函数,

if (this.positionsInPercent && this._owner.parent) {
                ex = gv.px * this._owner.parent.width;
                ey = gv.py * this._owner.parent.height;
            }
这几句代码,里面的this._owner.parent.width和高是编辑器里面的宽高(父级组件还没有执行makeFullScreen()),所以得到的位置只是编辑器里面的位置
当执行这一句的时候this._view.makeFullScreen();并不会触发控制器的位置刷新,所以导致当界面打开后,切换控制器的时候,下一次执行GearXY里面的apply函数的时候,this._owner.parent.width和高已经是舞台的宽高了,所以出现位置变换
编辑器里面百分比选项tips提示建议添加对容器的百分比位置关联,  如果添加了,就回到这个问题里面了
https://ask.fairygui.com/?/question/5379
添加对容器的关联以后,this._view.makeFullScreen();执行这一句的时候,会更新GearXY里面的
updateState函数,但是这个函数是只更新当前控制器的selectedPageId

public updateState(): void {
            var gv: Value = this._storage[this._controller.selectedPageId];
            if (!gv)
                this._storage[this._controller.selectedPageId] = gv = {};
            gv.x = this._owner.x;
            gv.y = this._owner.y;
            gv.px = this._owner.x / this._owner.parent.width;
            gv.py = this._owner.y / this._owner.parent.height;
        }
而且改变了当前selectedpageid对应的gv.px 和gv.py ,  所以导致切换控制器的时候,按钮一样会位置跳动,(本来编辑器里面编辑的是控制器page0和page1控制的按钮位置和百分比都是一样的,)因为执行updateState这个更改了当前pageid的对应百分比,所以切换控制器,按钮也是一样跳动,
上面是我理解的,
附近添加了demo,麻烦看一下,谢谢 ( 是不是改变容器宽高的时候,里面对应的组件有位置百分比控制的,也要刷新才对呢 )
 
两种方式,都是初始都是不对的,
已邀请:

谷主

赞同来自:

以后查查

要回复问题请先登录注册