UNPKG

ycc.js

Version:

Mini and powerful canvas engine for creating App or Game.

291 lines (242 loc) 7.37 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name=viewport content="width=device-width,initial-scale=1,user-scalable=0,viewport-fit=cover"> <title>多图层示例</title> <link href="https://cdn.bootcss.com/pure/1.0.0/pure.css" rel="stylesheet"> <link rel="stylesheet" href="../style.css"> <style> #stage{ float:left; } canvas{ background-color: #ccc; } .right-section{ float:left; } #layer canvas{ width:80px; margin-top: 5px; } .layer-box table input{ width:30px; } .layer-box table{ text-align: center; } </style> </head> <body> <div class="return-btn"> <a href="../"> 返回首页 </a> </div> <div class="tip"> <h3>示例说明:</h3> <div> 1、这个示例展示系统的多图层功能。<br> 2、PC端可以在绘图区拖动鼠标绘制,移动端可以拖拽绘制。<br> 3、每次绘制结束,都会在图层信息内更新每个图层的信息。<br> 4、更改图层信息的坐标值、显隐等数据,这些变化也会反应到绘图区。<br> </div> <br><br> </div> <div id="stage"> <div>绘图区(拖动鼠标绘制) <button onclick="newLayer()">新建图层</button></div> <br> <div id="canvas"></div> <br> <span>注:图层原本为透明色,灰色仅仅是为了显示效果</span> </div> <div class="right-section"> <h4>图层信息 </h4> <span style="color: red; display: none;font-size: 12px;" id="tip">没有图层,不能绘制,请点击新建图层</span> <div id="layer"> </div> </div> <!-- 新增图层的模板 --> <div id="layer-box-tpl" style="display: none;"> <div class="layer-box" id="__tplID__" style="margin-top: 10px;border-bottom:1px solid #000;padding:10px 0;width:300px;"> <!--<canvas width="300" height="150"></canvas>--> <!--<div class="props"> <div class="title" style="font-weight: bold;">图层属性</div> <form class="pure-form pure-g"> <div class="pure-control-group pure-u-1-2 pure-g"> <label>id</label> <input class="pure-input-1-2" disabled value="__id__"> </div> <div class="pure-control-group pure-u-1-2 pure-g"> <label>name</label> <input class="pure-input-1-2" disabled value="__name__"> </div> <div class="pure-control-group pure-u-1-2 pure-g"> <label>x</label> <input type="number" class="pure-input-1-2" value=__x__ onchange="propsOnChange(__id__,'x',parseInt(this.value))"> </div> <div class="pure-control-group pure-u-1-2 pure-g"> <label>y</label> <input type="number" class="pure-input-1-2" value=__y__ onchange="propsOnChange(__id__,'y',parseInt(this.value))"> </div> </form> </div> <div> <button class="pure-button" onclick="deleteLayer('__id__')">删除图层</button> <button class="pure-button" onclick="showLayer('__id__')">图层显隐</button> </div>--> <table border="1" width="100%"> <tr> <td>缩略图</td> <td>id</td> <!--<td>name</td>--> <td >x</td> <td>y</td> <td>操作</td> </tr> <tr> <td><canvas width="300" height="150"></canvas></td> <td>__id__</td> <!--<td>__name__</td>--> <td> <input type="number" value=__x__ onchange="propsOnChange(__id__,'x',parseInt(this.value))"> </td> <td> <input type="number" value=__y__ onchange="propsOnChange(__id__,'y',parseInt(this.value))"> </td> <td> <a href="javascript:void(0);" class="" onclick="deleteLayer('__id__')">删除</a> <a href="javascript:void(0);" class="" onclick="showLayer('__id__')">显隐</a> </td> </tr> </table> </div> </div> </body> </html> <script src="../common.js"></script> <script src="http://localhost:9000/livereload.js"></script> <script src="../../build/ycc.js"></script> <script> var ycc = new Ycc(); var stage = ycc.createCanvas({width:300,height:150,dpiAdaptation:true}); document.getElementById("canvas").appendChild(stage); ycc.bindCanvas(stage); var layerDom = document.getElementById("layer"); document.getElementById('tip').style.display = "block"; // newLayer(); /** * 属性更改监听 * */ function propsOnChange(layerId,prop,val){ console.log('on change...',layerId,prop,val); var layer = ycc.findLayerById(layerId); layer[prop] = val; ycc.layerManager.reRenderAllLayerToStage(); } /** * * */ function newLayer() { document.getElementById('tip').style.display = "none"; var layer = ycc.layerManager.newLayer({enableEventManager:true,name:'child'}); ycc.layerManager.enableEventManagerOnly(layer); ycc.layerManager.reRenderAllLayerToStage(); pen(); renderLayerToHtml(); /** * 钢笔 */ function pen() { var startDot = []; var hasMoved = false; var ui = null; layer.onclick = function (e) {}; layer.ondragstart = function (e) { console.log(e.x,e.y); startDot = layer.transformToLocal(new Ycc.Math.Dot(e.x,e.y)); ui = new Ycc.UI.BrokenLine({color:"red",width:3,onclick:function (e) { console.log(e); }}); layer.addUI(ui); ui.pointList.push(startDot); }; layer.ondragging = function (e) { hasMoved = true; var moveDot = layer.transformToLocal(new Ycc.Math.Dot(e.x,e.y)); ui.pointList.push(moveDot); ui.computeUIProps(); ycc.layerManager.reRenderAllLayerToStage(); }; layer.ondragend = function (e) { if(!hasMoved) return null; renderLayerToHtml(); ycc.photoManager.takePhoto(); hasMoved = false; }; } } /** * 删除图层的点击事件 * @param layerId */ function deleteLayer(layerId) { layerId = parseInt(layerId); ycc.layerManager.deleteLayer(ycc.findLayerById(layerId)); ycc.layerManager.reRenderAllLayerToStage(); document.getElementById("ycc-layer-"+layerId).remove(); if(getShowLayer().length===0) document.getElementById('tip').style.display = "inline"; } /** * 获取用于显示的图层列表 */ function getShowLayer() { return ycc.layerList.filter(function (item) { return item.name==='child'; }); } /** * 图层显示和隐藏 * */ function showLayer(layerId) { layerId = parseInt(layerId); ycc.findLayerById(layerId).show = !ycc.findLayerById(layerId).show; ycc.layerManager.reRenderAllLayerToStage(); } /** * 绘制图层至右侧canvas */ function renderLayerToHtml() { layerDom.innerHTML=""; for(var i=getShowLayer().length-1;i>=0;i--){ var layer = getShowLayer()[i]; var renderData = Ycc.utils.mergeObject({ x:0, y:0, name:0, id:0 },layer,false); renderData.tplID = "ycc-layer-"+layer.id; console.log(renderData); layerDom.innerHTML+=Ycc.utils.renderTpl(document.getElementById("layer-box-tpl").innerHTML,renderData); } for(var j=getShowLayer().length-1;j>=0;j--){ var _layer = getShowLayer()[j]; var _tplID = "ycc-layer-"+_layer.id; var canvasList = document.getElementById(_tplID).getElementsByTagName("canvas"); var canvas = canvasList[0]; // canvas.style.width=canvas.width+'px'; canvas.width*=ycc.getSystemInfo().devicePixelRatio; canvas.height*=ycc.getSystemInfo().devicePixelRatio; var layerYcc = new Ycc().bindCanvas(canvas); var newLayer = layerYcc.layerManager.newLayer({enableEventManager:true}); _layer.uiList.forEach(function (ui) { newLayer.addUI(ui.clone()); }); layerYcc.layerManager.reRenderAllLayerToStage(); } } </script>