1 /** 2 * Hilo 3 * Copyright 2015 alibaba.com 4 * Licensed under the MIT License 5 */ 6 7 /** 8 * @class Drawable是可绘制图像的包装。 9 * @param {Object} properties 创建对象的属性参数。可包含此类所有可写属性。 10 * @module hilo/view/Drawable 11 * @requires hilo/core/Class 12 * @requires hilo/util/util 13 * @property {Object} image 要绘制的图像。即可被CanvasRenderingContext2D.drawImage使用的对象类型,可以是HTMLImageElement、HTMLCanvasElement、HTMLVideoElement等对象。 14 * @property {array} rect 要绘制的图像的矩形区域。 15 */ 16 var Drawable = Class.create(/** @lends Drawable.prototype */{ 17 constructor: function(properties){ 18 this.init(properties); 19 }, 20 21 image: null, 22 rect: null, 23 24 /** 25 * 初始化可绘制对象。 26 * @param {Object} properties 要初始化的属性。 27 */ 28 init: function(properties){ 29 var me = this, oldImage = me.image; 30 if(Drawable.isDrawable(properties)){ 31 me.image = properties; 32 }else{ 33 util.copy(me, properties, true); 34 } 35 36 var image = me.image; 37 if(typeof image === 'string'){ 38 if(oldImage && image === oldImage.getAttribute('src')){ 39 image = me.image = oldImage; 40 }else{ 41 me.image = null; 42 //load image dynamically 43 var img = new Image(); 44 if(properties.crossOrigin){ 45 img.crossOrigin = "Anonymous"; 46 } 47 img.onload = function(){ 48 img.onload = null; 49 me.init(img); 50 }; 51 img.src = image; 52 return; 53 } 54 } 55 56 if(image && !me.rect) me.rect = [0, 0, image.width, image.height]; 57 }, 58 59 Statics: /** @lends Drawable */{ 60 /** 61 * 判断参数elem指定的元素是否可包装成Drawable对象。 62 * @param {Object} elem 要测试的对象。 63 * @return {Boolean} 如果是可包装成Drawable对象则返回true,否则为false。 64 */ 65 isDrawable: function(elem){ 66 if(!elem || !elem.tagName) return false; 67 var tagName = elem.tagName.toLowerCase(); 68 return tagName === "img" || tagName === "canvas" || tagName === "video"; 69 } 70 } 71 });