Как очистить определенную строку в Canvas: HTML5

Я совершенно новичок в этом элементе Canvas. Я могу нарисовать линию на холсте, но не могу очистить только определенную линию. Весь холст становится пустым.

попытался это: HTML-код:

<canvas id="cvs" width="400" height="400"></canvas>
<hr />
<input type="submit" id="reDrowA" value="Draw A" />
<input type="submit" id="reDrowB" value="Draw B" />
<hr />
<input type="submit" id="clearA" value="Clear A" />
<input type="submit" id="clearB" value="Clear B" />

скрипт

$(document).ready(function(){
    canvas =  document.getElementById("cvs");    
    $("#reDrowA").on("click",function(){
        a = canvas.getContext('2d');
        a.translate(0.5, 0.5);
        a.beginPath();
        a.setLineDash([2,10]);
        a.moveTo(10,10);
        a.lineTo(300,10);
        a.lineTo(300,300);
        a.stroke();
    });
    $("#reDrowB").on("click",function(){
        b = canvas.getContext('2d');
        b.translate(0.5, 0.5);
        b.beginPath();
        b.setLineDash([2,10]);
        b.moveTo(10,10);
        b.lineTo(10,300);
        b.lineTo(300,300);
        b.stroke();
    });
    $("#clearA").on("click",function(){
       a.clearRect(0, 0, canvas.width, canvas.height);
    });
    $("#clearB").on("click",function(){
        b.clearRect(0, 0, canvas.width, canvas.height);
    });

});

Скрипка:http://jsfiddle.net/8YNvu/

3 ответов


о холсте, "элементах" холста и видимости "элементов"...

когда любой элемент на холсте должен измениться (переместить, стереть и т. д.), стандартный метод-полностью стереть холст и перерисовать холст с элементами в их новых положениях (или не перерисовать элементы, если они стерты).

это потому, что холст не "помнит", где он нарисовал какой-либо отдельный элемент, и поэтому не может индивидуально перемещать или стирать любой элемент.

это до вас, чтобы "помнить" достаточно информации об элементе, чтобы перерисовать его после того, как холст был стерт.

Демо:http://jsfiddle.net/m1erickson/Wrk2e/

таким образом, в вашем примере вы можете создавать объекты javascript a и b чтобы представить ваши пути верхней правой и левой нижней строки.

каждый объект будет иметь точки, которые определяют его путь линии и флаг, указывающий, если он виден (visible = = перерисовать на холсте).

// create an object containing the top-right lines
// the object contains its path points & if it is visible or not
var a={
  path:[10,10, 300,10, 300,300],
  isVisible:false,
}

// create an object containing the left-bottom lines
// the object contains its path points & if it is visible or not
var b={
  path:[10,10, 10,300, 300,300],
  isVisible:false,
}

для удобства обработки вы можете поместить все свои объекты line-path в массив:

// an array containing all the line-path objects
var myObjects=[a,b];

затем, когда вы очищаете холст, вы просто используете информацию о каждом объекте line-path для перерисовки линии. Если флаг видимости определенных объектов false тогда не перерисовывайте этот конкретный объект.

// clear the entire canvas 
// redraw any line-paths that are visible
function redrawAll(myObjects){
    context.clearRect(0,0,canvas.width,canvas.height);
    for(var i=0;i<myObjects.length;i++){
        if(myObjects[i].isVisible){
            drawLinePath(myObjects[i]);
        }
    }
}

// redraw 1 line-path
function drawLinePath(theObject){
    var points=theObject.path;
    // save the current untranslated context state
    context.save();

    // draw lines through each point in the objects path
    context.translate(0.5, 0.5);
    context.beginPath();
    context.setLineDash([2,10]);
    context.moveTo(points[0],points[1]);
    for(var i=2;i<points.length;i+=2){
        context.lineTo(points[i],points[i+1]);
    }
    context.stroke();

    // restore the context to its untranslated state
    context.restore();
}

со всем этим на месте, ваши кнопки просто изменить флаг видимости на конкретном объекте line-path и затем очистите / перерисуйте весь холст.

// use buttons to set & clear the visibility flags on objects
// In all cases, clear the entire canvas and redraw any visible objects

$("#reDrowA").on("click",function(){
    a.isVisible=true;
    redrawAll(myObjects);
});
$("#reDrowB").on("click",function(){
    b.isVisible=true;
    redrawAll(myObjects);
});
$("#clearA").on("click",function(){
    a.isVisible=false;
    redrawAll(myObjects);
});
$("#clearB").on("click",function(){
    b.isVisible=false;
    redrawAll(myObjects);
});

холст прозрачен. Это невозможно acheive in single canvas tag. потому что clearRect функции для очистки на основе ширины и высоты. мы не дали точное положение, чтобы очистить холст. Попробуй скрипку . вы получаете сценарий с двумя тегами canvas.

Скрипка


вы просто re-paint the lines, которые должны сохраняться после того, как вы очистите холст.
может быть, такой: http://jsfiddle.net/8YNvu/10/