【问题标题】:Kinetics.js to automatically redraw canvas on user actionsKinetics.js 在用户操作上自动重绘画布
【发布时间】:2013-08-04 10:14:38
【问题描述】:

我正在使用 Kinetics.js 来操作我的画布和 jQuery 来处理用户操作。因此,当我一一使用它们时,所有功能都可以正常工作。但是当我尝试为一个事件组合两个函数时,例如 $('.selections img').click........(见下文)该函数只是设置背景并忽略文本。但是,创建了文本图层,但由于某种原因我看不到它。我尝试更改函数调用的顺序,但没有成功。

当我检查控制台时,没有错误或警报,当我使用 console.log 检查我的变量时 - 所有这些都打印到控制台。

这里可能有什么问题?

PS。这里的目标是保存 img 和 t 变量并将它们用于: 首先 - 在画布上绘制背景, 第二 - 在单独图层的现有背景上打印文本

 img = '';
 t = '';
 function setCanvas (){
        hiddenCanvas = new Kinetic.Stage({
        container : 'hiddenCanvasHolder',
        width : 2340,
        height : 1660

    });
}

function setBackground (image){
        background = new Kinetic.Layer();

    var imageObj = new Image();
     imageObj.onload = function (){
     var backImg = new Kinetic.Image({
         x: 0,
         y: 0,
         image: imageObj,
         width: 2340,
         height: 1660
         });
   background.add(backImg);
   hiddenCanvas.add(background);         
     };
     imageObj.src = image;
}

function setText(txt){
    textLayer = new Kinetic.Layer ();

    var text = new Kinetic.Text({
        x: 200,
        y: 500,
        text: txt,
        fontSize: 70,
        fontFamily: 'Calibri',
        fill: '#555',
        align: 'center'
        });
    textLayer.add(text);
    hiddenCanvas.add(textLayer);
}

$(document).ready(function(e) {
setCanvas();
setBackground(img);
setText(t);
/* Handles image selection and background setting for canvas */
$('.selections img').click(function(e) {
    img = $(this).attr('alt');
    textLayer.destroy();
    background.destroy();
    setBackground(img);
    setText(t);
});

/* Handles text input field and text printing to canvas */
$('#print').click(function(e) {
    t = $('#quoteInput').val();
    background.destroy();
    setBackground(img);
    textLayer.destroy();
    setText(t);
});

/* Handles quote selection from database instead of input it manually */




});

【问题讨论】:

    标签: javascript jquery canvas html5-canvas kineticjs


    【解决方案1】:

    您在函数范围内隐藏了其他函数所需的变量。

    • 隐藏画布
    • 背景
    • 文本层
    • img
    • t

    所以,

    • 将这些变量设置为全局变量或
    • 在需要的地方传递它们或
    • 在需要时创建它们

    更好的资源方法是按层销毁Children(),而不是销毁层本身:

         background.destroyChildren();
    
        textLayer.destroyChildren();
    

    另外,您将图像路径存储在 img 的 alt 属性中。

    这是对需要该属性来帮助他们理解图像的残疾观众的不尊重。

    这是代码和小提琴:http://jsfiddle.net/m1erickson/ZFz3z/

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>Prototype</title>
        <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
        <script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.5.4.min.js"></script>
    
    <style>
    #container{
      border:solid 1px #ccc;
      margin-top: 10px;
      width:234px;
      height:234px;
    }
    </style>        
    <script>
    $(function(){
    
        var hiddenCanvas = new Kinetic.Stage({
            container : 'container',
            width : 234,
            height : 234
        });
        var background = new Kinetic.Layer();
        hiddenCanvas.add(background);
        var textLayer = new Kinetic.Layer();
        hiddenCanvas.add(textLayer);
    
    
        function setBackground (image){
    
             var imageObj = new Image();
             imageObj.onload = function (){
             var backImg = new Kinetic.Image({
                 x: 0,
                 y: 0,
                 image: imageObj,
                 width: 234,
                 height: 234
                 });
                 background.destroyChildren();
                 background.add(backImg);
                 background.draw();
             };
             imageObj.src = image;
        }
    
        function setText(txt){
            var text = new Kinetic.Text({
                x: 20,
                y: 50,
                text: txt,
                fontSize: 36,
                fontFamily: 'Calibri',
                fill: '#555',
                align: 'center'
                });
                textLayer.destroyChildren();
                textLayer.add(text);
                textLayer.draw();
        }
    
        /* Handles image selection and background setting for canvas */
        $('.imgs').click(function(e) {
            img = $(this).attr('src');
            setBackground(img);
        });
    
        /* Handles text input field and text printing to canvas */
        $('#print').click(function(e) {
            t = $('#quoteInput').val();
            setText(t);
        });
    
    
    }); // end $(function(){});
    
    </script>       
    </head>
    
    <body>
        <div id="container"></div>
        <button id="print">Text</button>
        <input id="quoteInput" type="text" value="Hello">
        <img class="imgs" src="houseicon.png">
    </body>
    </html>
    

    【讨论】:

    • 哇,很好的答案。这很完美。感谢您的时间和精力。 Muchos gracias amigo。
    猜你喜欢
    • 2018-08-09
    • 2012-10-25
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多