1 2 /** 3 * @class DOM+CSS3渲染器。将可视对象以DOM元素方式渲染出来。 4 * @augments Renderer 5 * @param {Object} properties 创建对象的属性参数。可包含此类所有可写属性。 6 * @module hilo/renderer/DOMRenderer 7 * @requires hilo/core/Class 8 * @requires hilo/core/Hilo 9 * @requires hilo/renderer/Renderer 10 */ 11 var DOMRenderer = (function(){ 12 13 return Class.create({ 14 Extends: Renderer, 15 constructor: function DOMRenderer(properties){ 16 DOMRenderer.superclass.constructor.call(this, properties); 17 }, 18 19 /** 20 * @private 21 * @see Renderer#startDraw 22 */ 23 startDraw: function(target){ 24 if(target.visible && target.alpha > 0){ 25 //prepare drawable 26 var drawable = (target.drawable = target.drawable || new Drawable()); 27 drawable.domElement = drawable.domElement || createDOMDrawable(target, drawable); 28 return true; 29 } 30 return false; 31 }, 32 33 /** 34 * @private 35 * @see Renderer#draw 36 */ 37 draw: function(target){ 38 var parent = target.parent, 39 targetElem = target.drawable.domElement, 40 currentParent = targetElem.parentNode; 41 42 if(parent){ 43 var parentElem = parent.drawable.domElement; 44 if(parentElem != currentParent){ 45 parentElem.appendChild(targetElem); 46 } 47 }else if(target === stage && !currentParent){ 48 this.canvas.appendChild(targetElem); 49 } 50 }, 51 52 /** 53 * @private 54 * @see Renderer#transform 55 */ 56 transform: function(target){ 57 Hilo.setElementStyleByView(target); 58 }, 59 60 /** 61 * @private 62 * @see Renderer#remove 63 */ 64 remove: function(target){ 65 var targetElem = target.drawable.domElement, 66 parentElem = targetElem.parentNode; 67 68 if(parentElem) parentElem.removeChild(targetElem); 69 }, 70 71 /** 72 * @private 73 * @see Renderer#hide 74 */ 75 hide: function(target){ 76 var elem = target.drawable && target.drawable.domElement; 77 if(elem) elem.style.display = "none"; 78 } 79 }); 80 81 /** 82 * 创建一个可渲染的DOM,可指定tagName,如canvas或div。 83 * @param {Object} view 一个可视对象或类似的对象。 84 * @param {Object} imageObj 指定渲染的image及相关设置,如绘制区域rect。 85 * @return {HTMLElement} 新创建的DOM对象。 86 * @private 87 */ 88 function createDOMDrawable(view, imageObj){ 89 var tag = view.tagName || "div", 90 img = imageObj.image, 91 w = view.width || (img && img.width), 92 h = view.height || (img && img.height), 93 elem = Hilo.createElement(tag), style = elem.style; 94 95 if(view.id) elem.id = view.id; 96 style.position = "absolute"; 97 style.left = (view.left || 0) + "px"; 98 style.top = (view.top || 0) + "px"; 99 style.width = w + "px"; 100 style.height = h + "px"; 101 102 if(tag == "canvas"){ 103 elem.width = w; 104 elem.height = h; 105 if(img){ 106 var ctx = elem.getContext("2d"); 107 var rect = imageObj.rect || [0, 0, w, h]; 108 ctx.drawImage(img, rect[0], rect[1], rect[2], rect[3], 109 (view.x || 0), (view.y || 0), 110 (view.width || rect[2]), 111 (view.height || rect[3])); 112 } 113 }else{ 114 style.opacity = view.alpha != undefined ? view.alpha : 1; 115 if(view === stage || view.clipChildren) style.overflow = "hidden"; 116 if(img && img.src){ 117 style.backgroundImage = "url(" + img.src + ")"; 118 var bgX = view.rectX || 0, bgY = view.rectY || 0; 119 style.backgroundPosition = (-bgX) + "px " + (-bgY) + "px"; 120 } 121 } 122 return elem; 123 } 124 125 })();