摘要:概述下面我們來(lái)分析一下中的生命周期。定義了監(jiān)聽生命周期的類,這個(gè)三個(gè)成員方法分別執(zhí)行暫停繼續(xù)和刷新。方法作為橋梁,接收到具體的類型的函數(shù),創(chuàng)建的一個(gè)實(shí)例作為參數(shù)調(diào)用它。函數(shù)做了兩件事情暫停應(yīng)用程序,暫停背景音樂和音效的播放。
概述
下面我們來(lái)分析一下erget中的生命周期。
src/egret/player/SystemTicker.ts:
export namespace lifecycle { export type LifecyclePlugin = (context: LifecycleContext) => void; /** * @private */ export let stage: egret.Stage; /** * @private */ export let contexts: LifecycleContext[] = []; let isActivate = true; export class LifecycleContext { pause() { if (isActivate) { isActivate = false; stage.dispatchEvent(new Event(Event.DEACTIVATE)); if (onPause) { onPause(); } } } resume() { if (!isActivate) { isActivate = true; stage.dispatchEvent(new Event(Event.ACTIVATE)); if (onResume) { onResume(); } } } onUpdate?: () => void; } export let onResume: () => void; export let onPause: () => void; export function addLifecycleListener(plugin: LifecyclePlugin) { let context = new LifecycleContext(); contexts.push(context); plugin(context); } }
LifecycleContext定義了監(jiān)聽生命周期的類,pause(),resume(),update()這個(gè)三個(gè)成員方法分別執(zhí)行暫停、繼續(xù)和刷新。LifecyclePlugin定義了一個(gè)監(jiān)聽?wèi)?yīng)用程序狀態(tài)變化的函數(shù)類型,它有一個(gè)類型為L(zhǎng)ifecycleContext的context參數(shù)。addLifecycleListener()方法創(chuàng)建了LifecycleContext的一個(gè)實(shí)例,把這個(gè)實(shí)例作為參數(shù)調(diào)用了傳入的plugin()方法。
這樣看好像有點(diǎn)亂,我們梳理一下。
export type LifecyclePlugin = (context: LifecycleContext) => void;
因?yàn)椴煌脚_(tái)監(jiān)聽?wèi)?yīng)用程序狀態(tài)變化的實(shí)現(xiàn)不同(Native平臺(tái)要應(yīng)用到原生接口,Web使用一些Javascript的API),它們的共同點(diǎn)是要用到LifecycleContext的一個(gè)實(shí)例,在對(duì)應(yīng)的監(jiān)聽實(shí)現(xiàn)代碼里去調(diào)動(dòng)這個(gè)實(shí)例的pause(),resume(),update()這三個(gè)方法去暫停、繼續(xù)和刷新應(yīng)用程序,所以定義了LifecyclePlugin這個(gè)函數(shù)類型。
function addLifecycleListenerexport function addLifecycleListener(plugin: LifecyclePlugin) { let context = new LifecycleContext(); contexts.push(context); plugin(context); }
addLifecycleListener()方法作為橋梁,接收到具體的LifecyclePlugin類型的函數(shù),創(chuàng)建LifecycleContext的一個(gè)實(shí)例作為參數(shù)調(diào)用它。
class LifecycleContextlet isActivate = true; export class LifecycleContext { pause() { if (isActivate) { isActivate = false; stage.dispatchEvent(new Event(Event.DEACTIVATE)); if (onPause) { onPause(); } } } resume() { if (!isActivate) { isActivate = true; stage.dispatchEvent(new Event(Event.ACTIVATE)); if (onResume) { onResume(); } } } onUpdate?: () => void; } export let onResume: () => void; export let onPause: () => void;
isActivate作為一個(gè)布爾值類型的成員屬性用來(lái)標(biāo)記當(dāng)前是否暫停,這個(gè)if語(yǔ)言的作用是防止重復(fù)觸發(fā)暫停事件,如果觸發(fā),主要做了兩件事情,一個(gè)是向全局事件系統(tǒng)觸發(fā)了一個(gè)Event.DEACTIVATE類型的事件(關(guān)于全局事件系統(tǒng)在后面的章節(jié)中具體分析)。一個(gè)是調(diào)用了onPause()方法。我們?cè)趀gret-core/tools/templates/game/src/Main.ts中找到這幾行
private onAddToStage(event: egret.Event) { egret.lifecycle.addLifecycleListener((context) => { // custom lifecycle plugin context.onUpdate = () => { console.log("hello,world") } }) egret.lifecycle.onPause = () => { egret.ticker.pause(); } egret.lifecycle.onResume = () => { egret.ticker.resume(); } //設(shè)置加載進(jìn)度界面 //...... //初始化Resource資源加載庫(kù) //...... } /** * 心跳計(jì)時(shí)器單例 */ export let ticker: sys.SystemTicker = new sys.SystemTicker();
這里延遲定義了onPause()方法,這個(gè)方法只有一行,執(zhí)行了egret.ticker.pause()方法。resume()方法類似pause()方法。
使用例子 Web平臺(tái) Native平臺(tái)egret-core/src/egret/native/NativeHideHandler.ts:
namespace egret.native { /** * @private */ export let NativeLifeCycleHandler: egret.lifecycle.LifecyclePlugin = (context) => { egret_native.pauseApp = () => { context.pause(); egret_native.Audio.pauseBackgroundMusic(); egret_native.Audio.pauseAllEffects(); }; egret_native.resumeApp = () => { context.resume(); egret_native.Audio.resumeBackgroundMusic(); egret_native.Audio.resumeAllEffects(); }; } }
這個(gè)Native平臺(tái)監(jiān)聽函數(shù)定義了原生平臺(tái)的兩個(gè)方法egret_native.pauseApp()和egret_native.resumeApp()。pauseApp()函數(shù)做了兩件事情:暫停應(yīng)用程序,暫停背景音樂和音效的播放。resumeApp()類似。
egret-core/src/egret/native/NativePlayer.ts:
namespace egret.native { /** * @private */ export class NativePlayer extends egret.HashObject implements egret.sys.Screen { //... private init(option: PlayerOption): void { //... lifecycle.addLifecycleListener(NativeLifeCycleHandler); //... } //... } }
這里利用addLifecycleListener()方法綁定了NativeLifeCycleHandler()這個(gè)函數(shù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/92847.html
摘要:異步函數(shù)對(duì)象接口,包含和兩個(gè)成員方法。哈希計(jì)數(shù)在整個(gè)的源碼中都沒有找到和方法的調(diào)用,這兩個(gè)方法的具體作用是在原生中實(shí)現(xiàn)類式繼承和私有屬性一類的功能。 文件結(jié)構(gòu) utils/HashObject.ts文件:showImg(https://segmentfault.com/img/bVZpuq?w=642&h=472); 首先解釋一下文件結(jié)構(gòu)圖 __extends方法 通過(guò)原型對(duì)象模擬類...
摘要:是一個(gè)靜態(tài)類,調(diào)用方法來(lái)初始化各項(xiàng)支持信息。小結(jié)通過(guò)和這兩個(gè)靜態(tài)類初始化了項(xiàng)目運(yùn)行的環(huán)境參數(shù),然后創(chuàng)建了屏幕適配器根據(jù)不同的適配策略調(diào)整。下一篇源碼分析全局哈希基類和全局異步函數(shù)對(duì)象接口 egret的github地址是https://github.com/egret-labs...,大家自己git clone到本地。 一.路口html文件 用ergetWing新建一個(gè)工程,打開根目錄下...
閱讀 2984·2023-04-26 00:23
閱讀 3399·2021-09-13 10:28
閱讀 2178·2021-08-31 14:18
閱讀 2885·2019-08-30 15:54
閱讀 1939·2019-08-30 15:43
閱讀 1276·2019-08-29 16:56
閱讀 2800·2019-08-29 14:16
閱讀 2054·2019-08-28 17:51