Egret-Android微端App启动页显示游戏资源加载进度

前言

Egret微端打包Android App,照抄>>>官方启动页示例<<<,修改背景图作为我们自己的游戏启动页,如果程序中设置启动页自动关闭,则在正式显示游戏页面之前,会有一段时间的黑屏,这段时间时在加载项目中的js文件等,如果改为手动关闭,一直显示引导页,有时加载速度缓慢的话,用户体验极其不好,所以一直考虑在启动页显示资源加载进度,>>>Egret社区<<<一直需求解决方法无果.

所以想,既然官方自己可以在启动页显示App运行情况(如显示下载Runtime进度),我是不是也可以,然后自己实现了App和启动页js的交互,结果Egret提示”ExternalInterface调用了js没有注册的方法”,启动页没反应

那么,一段时间后,既然自己定义的js方法不行,我就调用官方的js方法,源码里找到官方app和js交互的方法,然后在egretMiniAppLoadingProgress方法中加入自己的分类。

开始

1.启动页(可参照官方启动页示例,然后进行局部修改)

window.egretMiniAppLoadingProgress = function (msg, val) {
            var bar = document.getElementById('bar');
            bar.style.width = val + "%";
            var infoMsg = 'StartEngine [' + val + '%]';
            switch (msg) {
                case "requestingRuntime"://请求 runtime 信息
                    infoMsg = "请求 runtime 信息";
                    break;
                case "loadingRuntime"://下载 runtime
                    infoMsg = "下载 runtime";
                    break;
                case "loadingGame":
                    infoMsg = "加载游戏资源";
                    break;
                case "gameStarted":
                    infoMsg = "启动游戏";
                    break;
                case "loadRuntimeFailed":
                    infoMsg = "下载runtime出错";
                    break;
                //***以下是自定义的,可灵活修改***
                case "readyResource":
                    infoMsg = "准备游戏资源";
                    break;
                case "loadingResource":
                    infoMsg = "加载游戏资源";
                    break;
                case "loadingConfig":
                    infoMsg = "加载配置文件";
                    break;
                case "startGame":
                    infoMsg = "启动游戏";
                    break;
            }
            document.getElementById('info').innerHTML = infoMsg;
        }

2.Egret项目index.html与App交互,发送资源加载信息(简单举例)

var loadJson = function (url) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.addEventListener("load", function () {
            // 与Native的交互
            sendProcess2App("loadingConfig", 100);
            var data = JSON.parse(xhr.response);
            runGame(data);
        });
        xhr.send(null);
    }

var sendProcess2App = function (method, percent) {
        // if (egret && egret.ExternalInterface) {
        //     egret.ExternalInterface.call("callNative", method + ":" + percent);
        //     return;
        // }
        if (window['ExternalInterface']) {
            window['ExternalInterface']['call']("callNative", method + ":" + percent);
        }

3.App端进行响应&与启动页进行交互

// 游戏资源加载进度
launcher.setExternalInterface("callNative", new INativePlayer.INativeInterface() {
            @Override
            public void callback(String s) {
                String[] param = s.split(":");
                //***关键代码***
                launcher.a(param[0],Integer.parseInt(param[1]));
            }
        });

结束

这样基本就是实现了本文所需,但是并不是官方正式方法,也因为强行使用 launcher.a(),导致我们的交互显的那么的无法理解,哈哈哈

猜你喜欢

转载自blog.csdn.net/a564239493/article/details/80794388