[]UI加载完成后无法获取控件的大小——超详细版问题

1,背景。
引入 了DOM,需要将DOM在resize 和scroll的时候 始终绑定到UI中的 参考label上。
 
2,目前遇到的问题
PC端测试,在UI加载完成后,将DOM绑定到resize和scroll事件上,可以实现DOM与参考Label 位置绑定。
 但是,在手机上,如微信浏览器,初次加载时,由于浏览器一直存在,且大小不变,因此没有resize事件被触发,无法在resize回调中完成绑定。
于是 需要在UI加载完成 后,初始化 一次,将DOM和Label绑定在一起。
 
3,新的目标
在 resize 和scroll发生之前,如:手机页面第一次加载,或PC浏览器加载后F5刷新引发的第一次加载时,拿到参考Label的位置和大小信息。
 
4,在采用相对布局时,拿不到 参考Label 位置和大小信息。
UI设计 层次如下:

uidesign.PNG

 
VIEW是绝对布局400*800;Panel四 边相对布局充满VIEW;Panel下的参考Label,var=myref,左右相对布局。
 
代码如下:
import test = ui.test.TestPageUI;
import Label = laya.ui.Label;
import Handler = laya.utils.Handler;
import Loader = laya.net.Loader;
import Stage = laya.display.Stage;

class TestUI extends ui.test.testwhUI {

constructor() {
super();
this.mypan.vScrollBarSkin = "";
Laya.stage.on(Laya.Event.RESIZE, this, this.fitDOMElements);
this.mypan.vScrollBar.on(Laya.Event.CHANGE, this, this.fitDOMElements_scroll);
}
private fitDOMElements(a, b, c, d, e, f): void {
console.log("----------the event resize-------")
console.log("ref-resize:", this.myref.getBounds());
console.log("pan-resize", this.mypan.getBounds());
}

private fitDOMElements_scroll(a, b, c, d, e, f): void {
console.log("----------the event scroll-------")
console.log("ref-scroll:", this.myref.getBounds());
console.log("pan-scroll", this.mypan.getBounds());
}
}

// 程序入口
Laya.init(400, 800);
// Laya.stage.scaleMode = Stage.SCALE_EXACTFIT;
Laya.stage.scaleMode = Stage.SCALE_FIXED_WIDTH;
Laya.loader.load([{ url: "res/atlas/comp.json", type: Loader.ATLAS }], Handler.create(this, this.onLoaded));
function onLoaded(): void {
//实例UI界面
var testUI: TestUI = new TestUI();
Laya.stage.addChild(testUI);
console.log("myref-onloaded", testUI.myref.getBounds());
console.log("mypan-onloaded", testUI.mypan.getBounds());
Laya.stage.event(Laya.Event.RESIZE)
console.log("myref-event_resize", testUI.myref.getBounds());
console.log("mypan-event_resize", testUI.mypan.getBounds());
}

 
执行结果:
一:PC浏览器加载完成 后,不要 缩放浏览器,直接在 原地按F5刷新,模拟 手机加载的情况。无法获取Label的准确大小

out1.PNG

 
二,用 鼠标 滚动屏幕

out2.PNG

 
此时,参考Label的大小和坐标,可以得到准确的值[60,200,280,200]。
 
 
这就是现在的情况,初始化时 拿不到Label的位置和 宽高,在后续的触发事件中可以拿到。猜测是 我在初始化时获取位置信息,当时还没有完全加载。
 
5,目前需要解决的问题。
一, 除了资源加载 回调外,有没有其他的回调函数,可以等UI 完全加载完毕后,获取 到UI组件的准确位置信息。
二,我尝试过 在资源加载回调中, 修改scroll滚动条的位置,模拟 手工scroll屏幕, 没有生效,猜测还是因为时机不对,此时UI尚未完全加载。
 
6,将来的建议
绕了这么一个大圈,其实 就是为了创建一个DIV,在DIV上用 echarts库画图, 有没有办法直接获取到UI组件,如Label的DIV
这样可以直接将echart画 到label上。估计传统的基于DIV的库,也有这个需求。
 
麻烦帮看看啊,这几天都在 尝试解决这个问题,花了很久了。
多谢
 
 
源码项目已上传
 
已邀请:

cuixueying

赞同来自: peterz3g

		Laya.timer.once(500,this,this.onLoopOnce);
}
private onLoopOnce():void
{
this.mypan.vScrollBar.on(Laya.Event.CHANGE, this, this.fitDOMElements_scroll);
}
加个延迟再看下!

peterz3g

赞同来自:

已补充测试项目源码:testwh.rar

1561708963用户

赞同来自:

 请问找到解决的办法了没有?我也遇到类似的问题,我是想在ui初始化加载完成设置View的尺寸进行适配,但是不生效,延迟200ms就可以,我猜也是ui没有加载完成,设置尺寸无效,如果有个可以监听ui初始化加载完成回调的方法就好了== 

Hifun

赞同来自:

加延迟能靠得住么?有没有更好的办法?

要回复问题请先

商务合作
商务合作