LayaAir 事件处理器 Handler
目录
Handler
Handler.create 与 new Handler
编码示例
Handler
Package | laya.utils |
类 | public class Handler |
Inheritance | Handler Object |
1、Handler 是事件处理器类。这是优化内存的方式之一,可以参考《LayaAir 对象池 laya.utils.Pool》
2、推荐使用 Handler.create() 方法从对象池创建,减少对象创建消耗。创建的 Handler 对象不再使用后,可以使用 Handler.recover() 将其回收到对象池,回收后不要再使用此对象,否则会导致不可预料的错误。
3、注意:由于鼠标事件也用本对象池,不正确的回收及调用,可能会影响鼠标事件的执行。
4、开发过程中会经常使用 Handler 来完成异步回调。Laya.Handler.create 使用了内置对象池管理,因此在使用Handler对象时可使用 Laya.Handler.create 来创建回调处理器。以下代码使用 Laya.Handler.create 创建资源加载的回调处理器:
Laya.loader.load(urls, Laya.Handler.create(this, onAssetLoaded));
5、游戏中经常根据游戏逻辑和阶段分批加载资源,第一批资源加载完成,触发Laya.Handler.create()创建的complete事件回调方法后被对象池回收;当游戏进行到某个时候,需要加载第二批资源时,Laya.Handler.create()会首先在对象池中检索相同的回调方法处理器,如果找到就直接使用对象池中方法,从而节省了内存开销。
Method(方法) |
---|
Handler(caller:* = null, method:Function = null, args:Array = null, once:Boolean = false) ,根据指定的属性值,创建一个 Handler 类的实例。 |
clear():Handler ,清理对象引用。 |
create(caller:*, method:Function, args:Array = null, once:Boolean = true):Handler [static] 从对象池内创建一个Handler,默认会执行一次并立即回收,如果不需要自动回收,设置once参数为false。 |
recover():void ,清理并回收到 Handler 对象池内。 |
更多API参见官网:https://layaair.ldc.layabox.com/api/?category=Core&class=laya.utils.Handler
Handler.create 与 new Handler
/**
* 从对象池内创建一个Handler,默认会执行一次并立即回收,如果不需要自动回收,设置once参数为false。
* @param caller 执行域(this)。
* @param method 回调方法。
* @param args 携带的参数。
* @param once 是否只执行一次,如果为true,回调后执行recover()进行回收,默认为true。
* @return 返回创建的handler实例。
*/
static create(caller: any, method: Function, args?: Array<any>, once?: boolean): Handler;
1、如果需要多次触发Handler返回的回调方法,那么就需要对 Laya.Hanlder.create() 方法中的 once 参数设置为false。或者用 new Laya.Handler() 的方式创建。
2、例如在游戏开始界面中加载资源,对加载资源的进度进行显示时:
Laya.loader.load(urls, Laya.Handler.create(this,onAssetLoaded), Laya.Handler.create(this, onLoading));//错误写法
Laya.loader.load(urls, Laya.Handler.create(this,onAssetLoaded), Laya.Handler.create(this,onLoading, null, false));//正确写法
Laya.loader.load(urls, Laya.Handler.create(this,onAssetLoaded), new Laya.Handler(this, onLoading));//正确写法
3、使用 Laya.Handler.create(this,onLoading) 返回的回调方法,是要处理progress加载进度事件,由于回调执行一次之后就被对象池回收了,所以progress加载进度事件只触发了一次就结束了,但实际上资源并未加载完成,还处于加载中,所以必须设置 once 参数设置为false,或者用 new Laya.Handler() 的方式创建。
/**
* 根据指定的属性值,创建一个 <code>Handler</code> 类的实例。
* @param caller 执行域。
* @param method 处理函数。
* @param args 函数参数。
* @param once 是否只执行一次。
*/
Handler(caller?: any, method?: Function, args?: Array<any>, once?: boolean);
4、注意:new Handler() 是没有使用对象池的方式,Handler.create() 默认使用了对象池.。
编码示例
//初始化引擎
Laya.init(1000, 500, Laya.WebGL);
/**显示性能统计信息 */
Laya.Stat.show(0, 0);
var label_info;const imgUrls = [];
for (var i = 0; i < 10; i++) {imgUrls.push("http://tomcat.apache.org/res/images/tomcat.png");imgUrls.push("http://www.apache.org/img/asf_logo.png");imgUrls.push("https://cn.vuejs.org/images/logo.png?_sw-precache=cf23526f451784ff137f161b8fe18d5a");imgUrls.push("http://img02.tuke88.com/preview_music/00/08/56/preview-5b835eaf13a9b9053.mp3");imgUrls.push("https://spring.io/img/homepage/icon-your-app.svg");imgUrls.push("http://www.apache.org/images/SupportApache-small.png");imgUrls.push("https://avatar.csdn.net/6/D/4/3_wangmx1993328.jpg");imgUrls.push("https://official.layabox.com/public/img/LAYABOX_Logo.png");
}/**load 加载应用中将使用到的资源列表* 第1个参表示要加载的单个资源地址或资源信息数组,比如:简单数组:["a.png","b.png"]* 第2个参数加载结束回调* 第3个参数是加载进度回调,回调参数值为当前资源的加载进度信息(0-1),Handler 要反复回调,所以要设置为 false,否则执行一次就会自动删除的*/
Laya.loader.retryNum = 2;//加载出错后的重试次数,默认重试一次
Laya.loader.load(imgUrls,Laya.Handler.create(this, loadComplete),Laya.Handler.create(this, loadProgress, [], false));
showInfo();/** 资源加载完成时回调*/
function loadComplete(isSuccess) {console.log("资源加载完成...", isSuccess);label_info.removeSelf();/**加载完成后从父容器中删除标签 label_info */var sprite = new Laya.Sprite();sprite.graphics.drawTexture(Laya.loader.getRes(imgUrls[0]), 200);Laya.stage.addChild(sprite);
}/**资源加载过程中的进度回调* progress 取值 0-1 */
function loadProgress(progress) {label_info.text = parseInt(progress * 100) + "%";console.log("当前加载资源:" + progress);
}/**显示标签信息 */
function showInfo() {label_info = new Laya.Label("0%");label_info.fontSize = 20;label_info.color = "#fff";label_info.pos(200, 50);Laya.stage.addChild(label_info);
}
LayaAir 事件处理器 Handler相关推荐
- SAP CRM和Cloud for Customer中的Event handler(事件处理器)
SAP CRM可以在开发工具中用右键直接创建一个新的事件处理器: 这些事件处理器实际上就是UI控制器(Controller)上具有特定接口类型的方法. C4C UI的event handler 在C4 ...
- 百万数据报表读取:步骤分析以及自定义事件处理器
自定义处理器 package cn.learn.poi.entity.cn.learn.poi.handler;import cn.learn.poi.entity.PoiEntity; import ...
- ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理
在ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行 ...
- JavaScript为事件处理器传递参数 (转)
首先参考:javascript attachEvent和addEventListener 使用方法 attachEvent方法,为某一事件附加其它的处理事件.(不支持Mozilla系列) addEve ...
- 处理器 Handler 详解
在前面的章节,解读Java NIO的IO事件类型时讲到,可供选择器监控的通道IO事件类型包括以下4种: ·可读:SelectionKey.OP_READ ·可写:SelectionKey.OP_WRI ...
- 为Delphi程序添加事件和事件处理器
在Delphi中,事件实际上是专门化的属性,它是一个过程(procedure)的指针.要添加事件,首先应在所定义的类中说明一个用来指向事件过 程的指针,该指针的作用是当事件一旦发生,就通过这个指针执行 ...
- C#零基础入门04:打老鼠初级之枚举、重构、事件处理器
一:为界面加入"开始"."暂停"."停止" 经过上节课程我们的交互的过程,我们的程序增加了用户友好度,同时也可以记录更为详尽的成绩了.但是我 ...
- 前端MVC Vue2学习总结(四)——条件渲染、列表渲染、事件处理器
一.条件渲染 1.1.v-if 在字符串模板中,如 Handlebars ,我们得像这样写一个条件块: <!-- Handlebars 模板 --> {{#if ok}}<h1> ...
- office工作日志文件_风暴事件处理器–每个工作者的GC日志文件
office工作日志文件 在过去的三个月中,我正在与一个新团队合作,为电信领域的大数据分析构建产品. Storm事件处理器是我们使用的主要框架之一,它确实很棒. 您可以阅读其官方文档中的更多详细信息( ...
- 风暴事件处理器–每个工作者的GC日志文件
在过去的三个月中,我正在与一个新团队合作,为电信领域的大数据分析构建产品. Storm事件处理器是我们使用的主要框架之一,而且确实很棒. 您可以阅读其官方文档(已改进)中的更多详细信息. Storm使 ...
最新文章
- 综合使用union和limit区分结果并限制返回结果集的条数
- Oracle中的Union、Union All、Intersect、Minus 使用用法区别
- 容器部署不适合文件服务器,建议使用内置容器部署War文件与可执行jar
- 我要自学网python视频教程_人生苦短,请用Python!学习Python的四大理由
- Python嵌套列表解析式(又称列表推导式)写法剖析与应用举例
- php-5.6 安装部署整理
- 数据结构与算法笔记——用Go语言描述
- 人大金仓数据库Centos 7 部署
- 机房电脑怎么批量修改计算机名,批量设置IP地址和计算机名
- 计算机课怎么切屏,电脑怎么切屏 电脑如何切屏
- vue3.0性能优化点之静态标记(PatchFlag)
- dmp格式怎么转换_如何生成转储(dmp)文件--工具篇
- 字符格式(gbk utf8等)
- 清理linux日志的命令
- MTK6833 安卓智能核心板 / 5G安卓手机主板
- 『kuangbin带你飞』专题10:匹配问题
- 书写我的人生回忆录-这应该是给子女和父母最好的礼物
- Nginx相应原理及简单使用和配置
- 分享在培训机构的一些经历及几点建议
- python爬取网页源代码并存储到本地实例
热门文章
- 如何有效创建工作分解结构?
- 农民工兄弟学C#(4)
- 直推学习(transductive learning)
- 用jdbc操作mysql 实现注册功能_JDBC链接Mysql数据库---实现登陆注册功能
- unity 线程断点时卡机_Java使用JDI进行线上程序断点信息记录
- 拓端tecdat|R语言中实现广义相加模型GAM和普通最小二乘(OLS)回归
- 拓端tecdat|GARCH(1,1),MA以及历史模拟法的VaR比较
- 数据系统 需要的服务器配置,数据系统 需要的服务器配置
- clion opencv安装_Mac 下搭建 Clion + OpenCV4.x 的开发环境
- sql语句截取字符串