组件添加位置控制器选中使用百分比记录坐标的问题
组件添加位置控制器选中使用百分比记录坐标的问题
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,麻烦看一下,谢谢 ( 是不是改变容器宽高的时候,里面对应的组件有位置百分比控制的,也要刷新才对呢 )
两种方式,都是初始都是不对的,
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,麻烦看一下,谢谢 ( 是不是改变容器宽高的时候,里面对应的组件有位置百分比控制的,也要刷新才对呢 )
两种方式,都是初始都是不对的,
没有找到相关结果
已邀请:
1 个回复
谷主
赞同来自: