由于是从其他技术转来的Laya,角度可能会不太一样,在这里记录一些发现的用法或是遇到问题解决办法,能留档也希望作个参考

(一)num和string类型转换的简便用法:  “+”符号

在原本+号实现数字计算和字符串连接的基础上,它可以完成简便的强制类型转换(断言)

输入 输出
+string parseInt(string)
num+" " num.toString()
num+string num.toString() + string

示例:

var a = "0";
console.log(+a);//输出0
console.log(5+a);//输出"50"

var b = 0;
console.log(b+"");//输出"0"
console.log(b+"5");//输出"05"
(二)多个需要前后衔接的动画使用“时间线”来使之按顺序完成播放、

在一些特定节点下的所有子节点都需要增加动画时,这个功能很实用

(如:单用于展示操作步骤的提示界面)

可以直接使用循环来添加动画,不用再使用多行代码逐个添加缓动并手动设置间隔和开始时间

示例:

场景中有ImageBox节点,我希望所放置好的子节点的图片逐个进行缩放展示:

public ImageBox!: Laya.Box;
private timeLine:Laya.TimeLine = new Laya.TimeLine();

onAwake(): void {
    this.createTimerLine();
    //初始状态缩放设为0
    for (let i = 0; i < this.ImageBox.numChildren; i++) {
        (this.ImageBox.getChildAt(i) as Laya.Image).scaleX = 0;
        (this.ImageBox.getChildAt(i) as Laya.Image).scaleY = 0;
    }
    this.timeLine.play(0,false);
}

private createTimerLine() {
    for (let i = 0; i < this.ImageBox.numChildren; i++) {
        this.timeLine.addLabel("scareImage"+ i,0).to(this.ImageBox.getChildAt(i),{ scaleX: 1, scaleY: 1},200,null);
    }
}

除了单种动画的复用,也可以完成多个不同动画的衔接播放:

示例:

this.timeLine.addLabel("lightShow", 0).to(this.light, { rotation: 300, scaleX: 1, scaleY: 1 }, 300, null);
this.timeLine.addLabel("lightRoate", 0).to(this.light, { rotation: 500}, 600, null);
this.timeLine.addLabel("lightClose", 0).to(this.light, { scaleX: 0, scaleY: 0 }, 200, null);

设置过后,按照需求再对时间线上的动画进行play播放就好,可以利用时间线分开批量管理动画,其中的动画功能不设限制,可以不同对象不同种类

(三)设置文本框自适应高度后,对高度进行获取和使用(以Lable组件为例)

文本框自适应高度或宽度在文本的Fit Content属性处设置:

在获取文本框高度进行其他使用时,要使用以下代码来获取动态改变后的高度

Label组件.textField.textHeight  //Label组件为需要获取高度的Lable组件

如果只使用组件.Height只能获取到原本动态改变之前的文本框高度

(四)文本字体大小自适应(常用于匹配多语言内容)

文本字体大小根据父节点宽度自适应可以通过以下代码实现:

//Lable组件为文本展示组件
if(this.Lable组件.textField.textWidth > this.Lable组件.width) {
    this.Lable组件.fontSize = (this.Lable组件.fontSize * (this.Lable组件.width / this.Lable组件.textField.textWidth)) | 0;
}

末尾的| 0 是用于计算结果取整,对计算数据没有其他影响

(五)命名避免使用内部关键字

本人遇到的是,在UI界面,使用了mask作为头像的遮罩Mask,后来发现在遮罩区域出现异常显示,出现裂痕,但是刷新之后可以剔除,再次登录又重新出现。

要避免在项目中(包括代码和UI界面)使用一些关键字,防止出现一些摸不着头脑的错误,很难定位到出错位置

同理,如果出现一些找不到问题的不符合常理的错误或显示,可以考虑这个修改角度

(六)list中的最大展示数量

如果界面中最大可展示的数量不是整数个,在设置list的RepeatY和RepeatX时,需向上取整,否则会导致list内容的展示,如:list展示的item数量正确,但是在最后多出一个item的位置留空

(七)使用spread(…)运算符进行数组克隆

它可以将数组展开成单独的元素,用其他空数组接收就可以进行原数组克隆了

如:

let num:number[] = [1,2,3,4,5];
let num2 = [...num];//num2中为1,2,3,4,5

需要注意的是,这个属于浅拷贝如果原数组内有引用类型,新的克隆数组中的元素依然会引用相同的对象,因此修改新数组内容时可能导致原数组的引用内容发生改变

(八)按钮的点击事件传参,在对应方法中undefined

刚开始的代码传参是

this._okBtn.on(Laya.Event.CLICK, this, this.onCheck, [this.inputBox]);
//this._inputBox代表的是需要操作的节点

onCheck(_input: Laya.Box[]){
    //操作
}

但是进行控制台打印测试的时候,拿到的_input总为undefined,导致后续操作无法正确进行

后来有尝试过使用bind方法

this._okBtn.on(Laya.Event.CLICK, this, this.onCheck.bind(this, this.inputBox));
//this._inputBox代表的是需要操作的节点

onCheck(_input: Laya.Box){
    //操作
}

但是bind方法依然没有解决问题

查出前面出错是由于参数传递的方式不正确导致的

最后还是使用箭头函数解决的问题,主要因为:它不会绑定自己的 this也不会创建自己的 arguments 对象,因此可以更自然地处理闭包和参数传递

this._okBtn.on(Laya.Event.CLICK, this, ()=>this.onCheck(this._inputBox);
//this._inputBox代表的是需要操作的节点

onCheck(_input: Laya.Box){
    //操作
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐