2014-04-07 6 views
0

내 문제는 KineticJS 버전 5부터 시작되었지만 그 전에는 문제가되지 않았습니다. 네모와 같은 네이티브 KineticJS 도형은 stage.toDataURL 함수를 사용하여 이미지 파일에 저장할 수 있습니다. 그러나 beginPath()와 같은 일반적인 캔버스 메서드로 그려진 비 키네틱 셰이프에서는 작동하지 않습니다. 및 canvas.fill(); (버전 4가이 작업을 잘 수행했습니다). 다음 코드는 빨간색과 파란색의 두 개의 직사각형을 그립니다. 빨간색은 사용자 정의, 파란색은 기본 동적 사각형입니다.KineticJS : toDataURL 함수에 사용자 정의 캔바스 모양을 포함하려면 어떻게해야합니까?

<body> 
    <div id="container"></div> 
     <button id="save"> 
     Save as image 
     </button>  
<script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v5.0.2.min.js"> </script> 
<script> 
    var stage = new Kinetic.Stage({ 
    container: 'container', 
    width: 578, 
    height: 200 
    }); 
    var layer = new Kinetic.Layer(); 

    var box = new Kinetic.Rect({ 
    x: 400, 
    y: 80, 
    width: 100, 
    height: 50, 
    fill: '#00D2FF', 
    stroke: 'black', 
    strokeWidth: 4, 
    draggable: true 
    }); 


    layer.add(box); 
    stage.add(layer); 

    var canvas = layer.getCanvas().getContext('2d'); 
    canvas.beginPath(); 
    canvas.setAttr('strokeStyle', 'black'); 
    canvas.setAttr('fillStyle', '#FF2222'); 
    canvas.setAttr('lineWidth', 8); 
    canvas.rect(50,80,100,50); 
    canvas.stroke(); 
    canvas.fill(); 


    document.getElementById('save').addEventListener('click', function() { 
    stage.toDataURL({ 
     callback: function(dataUrl) { 
     window.location.href = dataUrl; 
     } 
    }); 
    }, false); 
</script> 
</body> 

두 모양이 모두 표시되지만 파란색 직사각형 만 toDataURL 함수에 의해 생성 된 이미지에 나타납니다. 그들이 그린 방식은 KineticJS 5에서 fillStyle 등의 속성을 설정 한 부분에서 변경되었으므로 그 부분과 관련이있을 수도 있습니다. 또는 레이어가 추가 된 후 사용자 정의 모양이 추가되었다고 생각할 수도 있습니다. 무대 ...

답변

1

최근 버전 사이에 정확성이 많이 달라졌습니다.이 기능은 아마도 드로잉 기능에서 문제가있을 수 있습니다.

각 항목의 official docs을 참조해야하지만 기본적으로 사용자 정의 모양에는 약간 업데이트 된 속성이 있습니다 ... 먼저 "StrokeStyle"은 더 이상 유효한 속성이 아닙니다. '뇌졸중'을 사용하십시오. FillStyle에서도 마찬가지입니다.

또한 'dashArray'는 더 이상 유효하지 않으며, 이제는 '대시'가됩니다. 그래서 나는 'lineWidth'와 같은 리콜 대상이 아닌 ... 변경된 사항이 더 많을 것이라고 확신합니다. 이제 'strokeWidth'입니다 ...

또한 스트로크 및 채우기가 표시되거나 표시되지 않는 방식이 변경되었습니다. 예, 거의 당신이 사용하던 대부분의 방식이 약간 변경되었습니다. 'drawFunc'는 이제 'sceneFunc'입니다 ...

var ctx = layer.getContext(); 

var customShape01 = new Kinetic.Shape({ 

    sceneFunc: function(ctx) { 

     ctx.beginPath(); 
     ctx.moveTo(162.1, 213.8); 
     ctx.bezierCurveTo(162.1, 213.8, 180.7, 215.3, 193.5, 214.5); 
     ctx.bezierCurveTo(205.8, 213.7, 221.8, 212.3, 222.8, 221.4); 
     ctx.bezierCurveTo(222.9, 221.7, 222.9, 222.0, 222.9, 222.3); 
     ctx.bezierCurveTo(222.9, 232.4, 204.6, 232.7, 192.0, 227.1); 
     ctx.bezierCurveTo(179.4, 221.5, 163.1, 213.8, 162.1, 213.8); 
     ctx.closePath(); 
     ctx.fillStrokeShape(this); 
    }, 

    id: 'customShape01', 
    fill: 'rgb(255, 0, 255)', 
    stroke: 'black', 
    strokeWidth: 2, 
    lineJoin: 'round', 
    dash: [5,5], 
    dashEnabled: 'true', 
    strokeEnabled: 'true' 

}); 

(전체 팝업창을 허용해야 함) 체크 아웃하십시오. http://jsfiddle.net/axVXN/1/