Egret社区

请问exml文件加载的原理

2017-3-15 18:55
39094
5银子
各位大神,我在游戏里开头会载入主题文件default.thm.json,按道理游戏里用到的所有exml,都是从该文件中找到并载入。
但是游戏运行时,我把web服务器中skins目录删掉,发现有一个用于itemRender的exml加载失败,说明该exml是独立加载的?但是其他的exml并没有说加载失败。
请问exml文件加载的原理是怎样的?

分享到 :
0 人收藏

4 个回复

倒序浏览
wyb815  圆转纯熟 | 2017-3-16 09:28:45
如果你设置skinName用的是exml文件路径的话,就只会在控件初始化的时候网络请求加载。加载完毕会调用onExmlLoaded。用皮肤名的话就会加载在default.thm.json加载好的皮肤。以下是白鹭Component部分源码。
$parseSkinName():void {
            let skinName = this.skinName;
            let skin:any;
            if (skinName) {
                if (skinName.prototype) {
                    skin = new skinName();
                }
                else if (typeof(skinName) == "string") {
                    let clazz:any;
                    let text:string = skinName.trim();
                    if (text.charAt(0) == "<") {
                        clazz = EXML.parse(text);
                    }
                    else {
                        clazz = egret.getDefinitionByName(skinName);
                        if (!clazz && text.toLowerCase().indexOf(".exml") != -1) {
                            EXML.load(skinName, this.onExmlLoaded, this, true);
                            return;
                        }
                    }
                    if (clazz) {
                        skin = new clazz();
                    }
                }
                else {
                    skin = skinName;
                }
            }
            this.setSkin(skin);
        }
bentuhua  登堂入室 | 2017-3-16 13:29:17
wyb815 发表于 2017-3-16 09:28
如果你设置skinName用的是exml文件路径的话,就只会在控件初始化的时候网络请求加载。加载完毕会调用onExml ...

我设置skinName用的是exml文件路径。不过目前看,除了问题中的那个exml外,其他的都是从主题文件中提取的。所以才有这个问题
bentuhua  登堂入室 | 2017-3-16 13:59:08
我弄明白了。是主题文件中各个exml顺序的问题。
该exml有在其他皮肤中被用到,所以该exml在主题文件中应该排在前面。
但是现在问题又来了,主题文件是自动生成的,难道每次发布,都要手工去调整位置?
yjtx  官方团队 | 2017-3-16 14:08:58
上demo吧,默认都会加入到主题文件里的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部