AnnieJS API Docs for: 1.1.3
show:

File: libs/Flash2x.js

/**
 * Flash资源加载或者管理类,静态类,不可实例化
 * 一般都是初始化或者设置从Flash里导出的资源
 * @class Flash2x
 */
var Flash2x;
(function (Flash2x) {
    var URLLoader = annie.URLLoader;
    var Event = annie.Event;
    var ColorFilter = annie.ColorFilter;
    var Shape = annie.Shape;
    var BlurFilter = annie.BlurFilter;
    var ShadowFilter = annie.ShadowFilter;
    var ColorMatrixFilter = annie.ColorMatrixFilter;
    //打包swf用
    Flash2x._isReleased = false;
    //打包swf用
    Flash2x._shareSceneList = [];
    /**
     * 存储加载资源的总对象
     * @type {Object}
     */
    Flash2x.res = {};
    /**
     * 加载器是否正在加载中
     */
    var _isLoading;
    /**
     * 加载中的场景名列表
     */
    var _loadSceneNames;
    /**
     * 加载地址的域名地址或前缀
     */
    var _domain;
    /**
     * 当前加载到哪一个资源
     */
    var _loadIndex;
    /**
     * 当前加载的总资源数
     */
    var _totalLoadRes;
    /**
     * 当前已经加载的资源数
     */
    var _loadedLoadRes;
    /**
     * 加载资源的完成回调
     */
    var _completeCallback;
    /**
     * 加载资源时的进度回调
     */
    var _progressCallback;
    /**
     * 加载配置文件的加载器
     */
    var _JSONQueue;
    /**
     * 加载资源文件的加载器
     */
    var _loaderQueue;
    /**
     * 加载器是否初始化过
     */
    var _isInited;
    /**
     * 当前加载的资源配置文件内容
     */
    var _currentConfig;
    /**
     * 获取当前加载的时间当作随机数用
     */
    var _time;
    /**
     * 加载资源数和总资源数的比
     */
    var _loadPer;
    /**
     * 单个资源占总资源数的比
     */
    var _loadSinglePer;
    /**
     * 加载一个flash2x转换的文件内容,如果未加载完成继续调用此方法将会刷新加载器,中断未被加载完成的资源
     * @method loadScene
     * @public
     * @static
     * @since 1.0.0
     * @param {string} sceneName fla通过flash2x转换时设置的包名
     * @param {Function} progressFun 加载进度回调,回调参数为当前的进度值1-100
     * @param {Function} completeFun 加载完成回高,无回调参数
     * @param {string} domain 加载时要设置的url前缀,默认则不更改加载路径
     */
    Flash2x.loadScene = function (sceneName, progressFun, completeFun, domain) {
        if (domain === void 0) { domain = ""; }
        //加载资源配置文件
        if (_isLoading) {
            _JSONQueue.loadCancel();
            _loaderQueue.loadCancel();
        }
        _loadSceneNames = [];
        _domain = domain;
        if (typeof (sceneName) == "string") {
            if (!isLoadedScene(sceneName)) {
                Flash2x.res[sceneName] = {};
                _loadSceneNames.push(sceneName);
            }
            else {
                var info = {};
                info.sceneName = sceneName;
                info.sceneId = 1;
                info.sceneTotal = 1;
                completeFun(info);
            }
        }
        else {
            var len = sceneName.length;
            var index = 0;
            for (var i = 0; i < len; i++) {
                if (!isLoadedScene(sceneName[i])) {
                    Flash2x.res[sceneName[i]] = {};
                    _loadSceneNames.push(sceneName[i]);
                }
                else {
                    var info = {};
                    info.sceneName = sceneName[i];
                    info.sceneId = ++index;
                    info.sceneTotal = len;
                    completeFun(info);
                }
            }
        }
        if (_loadSceneNames.length == 0) {
            return;
        }
        if (!_isInited) {
            _time = new Date().getTime();
            _JSONQueue = new URLLoader();
            _JSONQueue.addEventListener(Event.COMPLETE, onCFGComplete);
            _loaderQueue = new URLLoader();
            _loaderQueue.addEventListener(Event.COMPLETE, _onRESComplete);
            _loaderQueue.addEventListener(Event.PROGRESS, _onRESProgress);
            _isInited = true;
        }
        _loadPer = 0;
        _loadIndex = 0;
        _totalLoadRes = 0;
        _loadedLoadRes = 0;
        _isLoading = true;
        _completeCallback = completeFun;
        _progressCallback = progressFun;
        _currentConfig = [];
        if (!Flash2x._isReleased) {
            _loadConfig();
        }
        else {
            //加载正式的单个文件
            //看看是否需要加载共享资源
            if (Flash2x._shareSceneList.length > 0 && (!isLoadedScene("f2xShare"))) {
                for (var i = 0; i < _loadSceneNames.length; i++) {
                    if (Flash2x._shareSceneList.indexOf(_loadSceneNames[i]) >= 0) {
                        _loadSceneNames.unshift("f2xShare");
                        break;
                    }
                }
            }
            _loadIndex = 0;
            _totalLoadRes = _loadSceneNames.length;
            _loadSinglePer = 1 / _totalLoadRes;
            for (var i = 0; i < _totalLoadRes; i++) {
                _currentConfig.push([{ src: "src/" + _loadSceneNames[i] + ".swf" }]);
            }
            _loadRes();
        }
    };
    function _loadConfig() {
        _JSONQueue.load(_domain + "resource/" + _loadSceneNames[_loadIndex] + "/" + _loadSceneNames[_loadIndex] + ".res.json?t=" + _time);
    }
    function onCFGComplete(e) {
        //配置文件加载完成
        var resList = e.data.response;
        _currentConfig.push(resList);
        _totalLoadRes += resList.length;
        _loadIndex++;
        if (_loadSceneNames[_loadIndex]) {
            _loadConfig();
        }
        else {
            //所有配置文件加载完成,那就开始加载资源
            _loadIndex = 0;
            _loadSinglePer = 1 / _totalLoadRes;
            _loadRes();
        }
    }
    function _onRESProgress(e) {
        if (_progressCallback) {
            _progressCallback((_loadPer + e.data.loadedBytes / e.data.totalBytes * _loadSinglePer) * 100 >> 0);
        }
    }
    function _onRESComplete(e) {
        var scene = _loadSceneNames[_loadIndex];
        if (!Flash2x._isReleased) {
            if (e.data.type != "js" && e.data.type != "css") {
                Flash2x.res[scene][_currentConfig[_loadIndex][0].id] = e.data.response;
            }
        }
        else {
            if (scene != "f2xShare") {
                var F2x = Flash2x;
                var JSResItem = F2x[scene + "Res"];
                for (var item in JSResItem) {
                    var resItem;
                    if (JSResItem[item].indexOf("audio/") > 0) {
                        resItem = new annie.Sound(JSResItem[item]);
                    }
                    else if (JSResItem[item].indexOf("image/") > 0) {
                        resItem = new Image();
                        resItem.src = JSResItem[item];
                    }
                    else {
                        resItem = JSON.parse(JSResItem[item]);
                    }
                    Flash2x.res[scene][item] = resItem;
                }
                delete F2x[scene + "Res"];
            }
            else {
                _currentConfig.shift();
                _loadSceneNames.shift();
                _loadRes();
                return;
            }
        }
        _checkComplete();
    }
    function _checkComplete() {
        _loadedLoadRes++;
        _loadPer = _loadedLoadRes / _totalLoadRes;
        _currentConfig[_loadIndex].shift();
        if (_currentConfig[_loadIndex].length > 0) {
            _loadRes();
        }
        else {
            var info = {};
            info.sceneName = _loadSceneNames[_loadIndex];
            _loadIndex++;
            info.sceneId = _loadIndex;
            info.sceneTotal = _loadSceneNames.length;
            if (_loadIndex == _loadSceneNames.length) {
                //全部资源加载完成
                _isLoading = false;
                //_progressCallback(100);
                setTimeout(function () { _completeCallback(info); }, 100);
            }
            else {
                _completeCallback(info);
                _loadRes();
            }
            Flash2x.res[info.sceneName]._f2x_had_loaded_scene = true;
        }
    }
    function _loadRes() {
        var url = _domain + _currentConfig[_loadIndex][0].src;
        if (Flash2x._isReleased) {
            _loaderQueue.responseType = "js";
            url += "?v=" + Flash2x._isReleased;
        }
        _loaderQueue.load(url);
    }
    /**
     * 判断一个场景是否已经被加载
     * @method isLoadedScene
     * @public
     * @static
     * @since 1.0.0
     * @param {string} sceneName
     * @returns {boolean}
     */
    function isLoadedScene(sceneName) {
        if (Flash2x.res[sceneName] != undefined && Flash2x.res[sceneName] != null && Flash2x.res[sceneName]._f2x_had_loaded_scene) {
            return true;
        }
        else {
            return false;
        }
    }
    Flash2x.isLoadedScene = isLoadedScene;
    /**
     * 删除一个场景资源,以方便系统垃圾回收
     * @method unLoadScene
     * @public
     * @static
     * @since 1.0.2
     * @param {string} sceneName
     */
    function unLoadScene(sceneName) {
        delete Flash2x.res[sceneName];
        var scene = eval(sceneName);
        for (var i in scene) {
            delete scene[i];
        }
        eval(sceneName + "=null;");
    }
    Flash2x.unLoadScene = unLoadScene;
    /**
     * 获取已经加载场景中的声音或视频资源
     * @method getMediaByName
     * @public
     * @static
     * @since 1.0.0
     * @param {string} sceneName
     * @param {string} mediaName
     * @returns {any}
     */
    function getMediaByName(sceneName, mediaName) {
        var s = Flash2x.res;
        if (s[sceneName][mediaName]) {
            return s[sceneName][mediaName];
        }
        return null;
    }
    Flash2x.getMediaByName = getMediaByName;
    /**
     * 通过已经加载场景中的图片资源创建Bitmap对象实例,此方法一般给Flash2x工具自动调用
     * @method b
     * @public
     * @since 1.0.0
     * @static
     * @param {string} sceneName
     * @param {string} imageName
     * @returns {any}
     */
    function b(sceneName, imageName) {
        var s = Flash2x.res;
        var isFind = false;
        if (s[sceneName][imageName]) {
            return new annie.Bitmap(s[sceneName][imageName]);
        }
        else {
            var m = 0;
            while (s[sceneName]["F2xSSIMG" + m]) {
                var data = s[sceneName]["F2xSSIMGData" + m];
                if (data[imageName] != undefined) {
                    isFind = true;
                    var imgData = data[imageName];
                    var spriteSheet = s[sceneName]["F2xSSIMG" + m];
                    //return {image: spriteSheet, rect: imgData};
                    return new annie.Bitmap(spriteSheet, imgData);
                }
                m++;
            }
            return null;
        }
    }
    Flash2x.b = b;
    /**
     * 用一个对象批量设置另一个对象的属性值,此方法一般给Flash2x工具自动调用
     * @method d
     * @public
     * @static
     * @since 1.0.0
     * @param {Object} display
     * @param {Object} baseInfo
     * @param {Object} extendInfo
     */
    function d(display, baseInfo, extendInfo) {
        if (baseInfo === void 0) { baseInfo = null; }
        if (extendInfo === void 0) { extendInfo = null; }
        if (baseInfo) {
            if (baseInfo.x != undefined) {
                display.x = baseInfo.x;
            }
            if (baseInfo.y != undefined) {
                display.y = baseInfo.y;
            }
            if (baseInfo.a != undefined) {
                display.scaleX = baseInfo.a;
            }
            if (baseInfo.b != undefined) {
                display.scaleY = baseInfo.b;
            }
            if (baseInfo.r != undefined) {
                display.rotation = baseInfo.r;
            }
            if (baseInfo.c != undefined) {
                display.skewX = baseInfo.c;
            }
            if (baseInfo.d != undefined) {
                display.skewY = baseInfo.d;
            }
            if (baseInfo.o != undefined) {
                display.alpha = baseInfo.o;
            }
            if (baseInfo.v != undefined) {
                display.visible = baseInfo.v;
            }
        }
        if (extendInfo && extendInfo.length > 0) {
            var index = 0;
            var filters = [];
            while (extendInfo[index] != undefined) {
                if (extendInfo[index] == 0) {
                    filters.push(new ColorFilter(extendInfo[index + 1], extendInfo[index + 2], extendInfo[index + 3], extendInfo[index + 4], extendInfo[index + 5], extendInfo[index + 6], extendInfo[index + 7], extendInfo[index + 8]));
                    index += 9;
                }
                else if (extendInfo[index] == 1) {
                    filters.push(new BlurFilter(extendInfo[index + 1], extendInfo[index + 2], extendInfo[index + 3]));
                    index += 4;
                }
                else if (extendInfo[index] == 2) {
                    var blur_1 = (extendInfo[index + 1] + extendInfo[index + 2]) * 0.5;
                    var color = Shape.getRGBA(extendInfo[index + 4], extendInfo[index + 5]);
                    var offsetX = extendInfo[index + 7] * Math.cos(extendInfo[index + 6] / 180 * Math.PI);
                    var offsetY = extendInfo[index + 7] * Math.sin(extendInfo[index + 6] / 180 * Math.PI);
                    filters.push(new ShadowFilter(color, offsetX, offsetY, blur_1));
                    index += 8;
                }
                else if (extendInfo[index] == 3) {
                    var blur_2 = (extendInfo[index + 1] + extendInfo[index + 2]) * 0.5;
                    var color = Shape.getRGBA(extendInfo[index + 4], extendInfo[index + 5]);
                    filters.push(new ShadowFilter(color, 0, 0, blur_2));
                    index += 6;
                }
                else if (extendInfo[index] == 4) {
                    filters.push(new ColorMatrixFilter(extendInfo[index + 1], extendInfo[index + 2], extendInfo[index + 3], extendInfo[index + 4]));
                    index += 5;
                }
            }
            display.filters = filters;
        }
    }
    Flash2x.d = d;
    /**
     * 创建一个动态文本或输入文本,此方法一般给Flash2x工具自动调用
     * @method t
     * @public
     * @static
     * @since 1.0.0
     * @param {number} type
     * @param {string} text
     * @param {number} size
     * @param {string} color
     * @param {string} face
     * @param {number} top
     * @param {number} left
     * @param {number} width
     * @param {number} height
     * @param {number} lineSpacing
     * @param {string} align
     * @param {boolean} italic
     * @param {boolean} bold
     * @param {string} lineType
     * @param {boolean} showBorder
     * @returns {annie.TextFiled|annie.InputText}
     */
    function t(type, text, size, color, face, top, left, width, height, lineSpacing, align, italic, bold, lineType, showBorder) {
        if (italic === void 0) { italic = false; }
        if (bold === void 0) { bold = false; }
        if (lineType === void 0) { lineType = "single"; }
        if (showBorder === void 0) { showBorder = false; }
        var textObj;
        if (type == 0 || type == 1) {
            textObj = new annie.TextField();
            textObj.text = text;
            textObj.font = face;
            textObj.size = size;
            textObj.lineWidth = width + left * 2;
            textObj.lineHeight = lineSpacing;
            textObj.textAlign = align;
            textObj.italic = italic;
            textObj.bold = bold;
            textObj.color = color;
            textObj.lineType = lineType;
            textObj.border = showBorder;
        }
        else {
            textObj = new annie.InputText(lineType);
            textObj.initInfo(text, width + left * 2, height + top * 2, color, align, size, face, showBorder, lineSpacing / size);
            if (italic) {
                textObj.italic = true;
            }
            if (bold) {
                textObj.bold = true;
            }
        }
        return textObj;
    }
    Flash2x.t = t;
    /**
     * 获取矢量位图填充所需要的位图,为什么写这个方法,是因为作为矢量填充的位图不能存在于SpriteSheet中,要单独画出来才能正确的填充到矢量中
     * @method sb
     */
    function sb(sceneName, bitmapName) {
        var sbName = "_f2x_s" + bitmapName;
        if (Flash2x.res[sceneName][sbName]) {
            return Flash2x.res[sceneName][sbName];
        }
        else {
            var bitmapData = null;
            var bitmap = b(sceneName, bitmapName);
            if (bitmap) {
                if (bitmap.rect) {
                    //从SpriteSheet中取出Image单独存放
                    bitmapData = annie.Bitmap.convertToImage(bitmap, false);
                }
                else {
                    bitmapData = bitmap.bitmapData;
                }
                Flash2x.res[sceneName][sbName] = bitmapData;
                return bitmapData;
            }
            else {
                trace("error:矢量位图填充时,未找到位图资源!");
                return null;
            }
        }
    }
    Flash2x.sb = sb;
    /**
     * 创建一个Shape矢量对象,此方法一般给Flash2x工具自动调用
     * @method s
     * @public
     * @static
     * @since 1.0.0
     * @param {Object} pathObj
     * @param {Object} fillObj
     * @param {Object} strokeObj
     * @returns {annie.Shape}
     */
    function s(pathObj, fillObj, strokeObj) {
        var shape = new annie.Shape();
        if (fillObj) {
            if (fillObj.type == 0) {
                shape.beginFill(fillObj.color);
            }
            else if (fillObj.type == 1) {
                shape.beginRadialGradientFill(fillObj.gradient[0], fillObj.gradient[1], fillObj.points);
            }
            else if (fillObj.type == 2) {
                shape.beginLinearGradientFill(fillObj.gradient[0], fillObj.gradient[1], fillObj.points);
            }
            else {
                shape.beginBitmapFill(sb(fillObj.bitmapScene, fillObj.bitmapName), fillObj.matrix);
            }
        }
        if (strokeObj) {
            if (strokeObj.type == 0) {
                shape.beginStroke(strokeObj.color, strokeObj.lineWidth, strokeObj.caps, strokeObj.joints, strokeObj.miter);
            }
            else if (strokeObj.type == 1) {
                shape.beginRadialGradientStroke(strokeObj.gradient[0], strokeObj.gradient[1], strokeObj.points, strokeObj.lineWidth, strokeObj.caps, strokeObj.joints, strokeObj.miter);
            }
            else if (strokeObj.type == 2) {
                shape.beginLinearGradientStroke(strokeObj.gradient[0], strokeObj.gradient[1], strokeObj.points, strokeObj.lineWidth, strokeObj.caps, strokeObj.joints, strokeObj.miter);
            }
            else {
                shape.beginBitmapStroke(sb(strokeObj.bitmapScene, strokeObj.bitmapName), strokeObj.matrix, strokeObj.lineWidth, strokeObj.caps, strokeObj.joints, strokeObj.miter);
            }
        }
        if (pathObj.type == 0) {
            shape.decodePath(pathObj.data);
        }
        else if (pathObj.type == 1) {
            shape.drawRoundRect(pathObj.data.x, pathObj.data.y, pathObj.data.w, pathObj.data.h, pathObj.data.topLeftRadius, pathObj.data.topRightRadius, pathObj.data.bottomLeftRadius, pathObj.data.bottomRightRadius);
        }
        else {
            shape.drawEllipse(pathObj.data.x, pathObj.data.y, pathObj.data.w, pathObj.data.h);
        }
        if (fillObj) {
            shape.endFill();
        }
        if (strokeObj) {
            shape.endStroke();
        }
        return shape;
    }
    Flash2x.s = s;
    /**
     * 向后台请求或者传输数据的快速简便方法,比直接用URLLoader要方便,小巧
     * @method ajax
     * @public
     * @since 1.0.0
     * @param info 向后台传送数据所需要设置的信息
     * @param {url} info.url 向后台请求的地址
     * @param {string} info.type 向后台请求的类型 get 和 post,默认为get
     * @param {Function} info.success 发送成功后的回调方法,后台数据将通过参数传回
     * @param {Function} info.error 发送出错后的回调方法,出错信息通过参数传回
     * @param {Object} info.data 向后台发送的信息对象,默认为null
     * @param {string} info.responseType 后台返回数据的类型,默认为"text"
     * @example
     *      //get
     *      Flash2x.ajax({
     *             type: "GET",
     *             url: serverUrl + "Home/Getinfo/getPersonInfo",
     *             responseType: 'json',
     *             success: function (result) {trace(result)},
     *             error: function (result) {trace(result)}
     *      })
     *      //post
     *      Flash2x.ajax({
     *             type: "POST",
     *             url: serverUrl + "Home/Getinfo/getPersonInfo",
     *             data: {phone:'135******58'},
     *             responseType: 'json',
     *             success: function (result) {trace(result)},
     *             error: function (result) {trace(result)}
     *      })
     */
    function ajax(info) {
        var urlLoader = new URLLoader();
        urlLoader.addHeader("X-Requested-With", "XMLHttpRequest");
        urlLoader.method = info.type == undefined ? "get" : info.type;
        urlLoader.data = info.data == undefined ? null : info.data;
        urlLoader.responseType = info.responseType == undefined ? "text" : info.responseType;
        if (info.success != undefined) {
            urlLoader.addEventListener(annie.Event.COMPLETE, info.success);
        }
        if (info.error != undefined) {
            urlLoader.addEventListener(annie.Event.ERROR, info.error);
        }
        urlLoader.load(info.url);
    }
    Flash2x.ajax = ajax;
    /**
     * jsonp调用方法
     * @method jsonp
     * @param url
     * @param type 0或者1 如果是0,后台返回的是data型jsonp 如果是1,后台返回的是方法型jsonp
     * @param callbackName
     * @param callbackFun
     * @static
     * @since 1.0.4
     * @example
     *      Flash2x.jsonp('js/testData.js', 1, 'getdata', function (result) {
     *          trace(result);
     *      })
     */
    function jsonp(url, type, callbackName, callbackFun) {
        var w = window;
        if (type == 1) {
            w[callbackName] = callbackFun;
        }
        var jsonpScript = document.createElement('script');
        var head = document.getElementsByTagName('head')[0];
        jsonpScript.onload = function (e) {
            if (type == 0) {
                callbackFun(w[callbackName]);
            }
            e.path[0].src = "";
            w[callbackName] = null;
            delete w[callbackName];
            head.removeChild(e.path[0]);
        };
        head.appendChild(jsonpScript);
        var param;
        if (url.indexOf("?") > 0) {
            param = "&";
        }
        else {
            param = "?";
        }
        jsonpScript.src = url + param + "a_n_n_i_e=" + Math.random() + "&callback=" + callbackName;
    }
    Flash2x.jsonp = jsonp;
    /**
     * 获取url地址中的get参数
     * @method getQueryString
     * @static
     * @param name
     * @returns {any}
     * @since 1.0.9
     * @example
     *      //如果当前网页的地址为http://xxx.xxx.com?id=1&username=anlun
     *      //通过此方法获取id和username的值
     *      var id=Flash2x.getQueryString("id");
     *      var userName=Flash2x.getQueryString("username");
     *      trace(id,userName);
     */
    function getQueryString(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
        var r = window.location.search.substr(1).match(reg);
        if (r != null)
            return decodeURIComponent(r[2]);
        return null;
    }
    Flash2x.getQueryString = getQueryString;
})(Flash2x || (Flash2x = {}));