วิธีล้างผ้าใบสำหรับการวาดใหม่


1012

หลังจากทดลองใช้งานคอมโพสิตและวาดภาพบนผืนผ้าใบตอนนี้ฉันกำลังพยายามลบภาพและคอมโพสิต ฉันจะทำสิ่งนี้ได้อย่างไร

ฉันต้องล้างผืนผ้าใบเพื่อวาดภาพอื่น สิ่งนี้สามารถดำเนินต่อไปได้ชั่วขณะหนึ่งดังนั้นฉันไม่คิดว่าการวาดรูปสี่เหลี่ยมผืนผ้าใหม่ทุกครั้งจะเป็นตัวเลือกที่มีประสิทธิภาพที่สุด

คำตอบ:


1292
const context = canvas.getContext('2d');

context.clearRect(0, 0, canvas.width, canvas.height);

42
โปรดทราบว่าclearRectคุณต้องมีบริบทที่ไม่ได้เปลี่ยนรูปแบบหรือติดตามขอบเขตจริงของคุณ
Phrogz

7
หมายเหตุเพิ่มเติมว่าการตั้งผ้าใบกว้าง) ต้องมีการตั้งค่าให้เป็นค่าที่แตกต่างกันและจากนั้นกลับมาอีกครั้งสำหรับการทำงานร่วมกัน Webkitและ b) นี้จะรีเซ็ตการเปลี่ยนแปลงบริบทของคุณ
Phrogz

45
อย่าใช้เคล็ดลับความกว้าง แฮ็คสกปรก ในภาษาระดับสูงเช่น JavaScript สิ่งที่คุณต้องการคือระบุความตั้งใจของคุณให้ดีที่สุดแล้วปล่อยให้โค้ดระดับต่ำลงมาเติมเต็ม การตั้งค่าความกว้างให้กับตัวมันเองนั้นไม่ได้บ่งบอกความตั้งใจที่แท้จริงของคุณ
andrewrk

22
รองลงมาทั้งหมดบอก context.clearRect(0, 0, context.canvas.width, context.canvas.height)แต่ผมขอแนะนำให้ มันมีประสิทธิภาพเหมือนกัน แต่มีการพึ่งพาน้อยลงหนึ่งรายการ (ตัวแปร 1 ตัวแทนที่จะเป็น 2)
gman

6
สำหรับผู้อ่านมากขึ้นล่าสุดของคำตอบนี้จะทราบว่าคำตอบนี้ได้รับการแก้ไขและว่าบางส่วนของความคิดเห็นดังกล่าวข้างต้นไม่ใช้
daveslab

719

ใช้: context.clearRect(0, 0, canvas.width, canvas.height);

นี่เป็นวิธีที่เร็วและเป็นคำอธิบายที่ชัดเจนที่สุดในการล้างผืนผ้าใบทั้งหมด

ไม่ได้ใช้: canvas.width = canvas.width;

การรีเซ็ตcanvas.widthรีเซ็ตสถานะ Canvas ทั้งหมด (เช่นการแปลง, LineWidth, strokeStyle ฯลฯ ) มันช้ามาก (เมื่อเทียบกับ clearRect) มันไม่ทำงานในเบราว์เซอร์ทั้งหมดและไม่ได้อธิบายสิ่งที่คุณพยายามทำจริง ๆ

การจัดการกับพิกัดที่ถูกแปลง

หากคุณมีการแก้ไขเปลี่ยนแปลงเมทริกซ์ (เช่นใช้scale, rotateหรือtranslate) แล้วcontext.clearRect(0,0,canvas.width,canvas.height)อาจจะไม่ชัดเจนส่วนที่มองเห็นทั้งหมดของผืนผ้าใบ

การแก้ไขปัญหา? รีเซ็ตเมทริกซ์การแปลงก่อนที่จะล้างผืนผ้าใบ:

// Store the current transformation matrix
context.save();

// Use the identity matrix while clearing the canvas
context.setTransform(1, 0, 0, 1, 0, 0);
context.clearRect(0, 0, canvas.width, canvas.height);

// Restore the transform
context.restore();

แก้ไข: ฉันเพิ่งเสร็จสิ้นการทำโปรไฟล์และ (ใน Chrome) มันเร็วกว่าประมาณ 10% ในการล้างผืนผ้าใบขนาด 300x150 (ขนาดเริ่มต้น) โดยไม่ต้องรีเซ็ตการแปลง เมื่อขนาดของผ้าใบเพิ่มความแตกต่างนี้จะลดลง

นั่นเป็นเรื่องที่ค่อนข้างไม่มีนัยสำคัญ แต่ในกรณีส่วนใหญ่คุณจะวาดภาพได้มากกว่าที่คุณกำลังเคลียร์และฉันเชื่อว่าความแตกต่างด้านประสิทธิภาพนี้ไม่เกี่ยวข้อง

100000 iterations averaged 10 times:
1885ms to clear
2112ms to reset and clear

4
@YumYumYum: มีความชัดเจน () ฟังก์ชั่นมาตรฐานหรือไม่ ดูเหมือนจะไม่เป็นเช่นนั้น
ดี

7
โปรดทราบว่าคุณสามารถลบความต้องการของcanvasตัวแปรโลคัลได้โดยใช้ctx.canvasแทน
Drew Noakes

1
@DrewNoakes จุดที่ดี แต่ฉันมักจะเลือกตัวแปรที่แยกต่างหากเพื่อความรวดเร็ว มันน้อยมาก แต่ฉันพยายามที่จะหลีกเลี่ยงเวลา dereferencing โดยการใช้นามแฝงคุณสมบัติที่ใช้บ่อย (โดยเฉพาะภายในวงภาพเคลื่อนไหว)
Prestaul

การสาธิตของ AlexanderN ไม่สามารถใช้งานได้อีกต่อไปเนื่องจากลิงก์รูปภาพที่ใช้งานไม่ได้คงที่: jsfiddle.net/Ktqfs/50
Domino

อีกวิธีหนึ่งในการล้างผืนผ้าใบทั้งหมดในกรณีที่มีการปรับเปลี่ยนเมทริกซ์การแปลงคือการติดตามการเปลี่ยนแปลงและใช้มันเองcanvas.widthและcanvas.heightเมื่อทำการล้าง ฉันไม่ได้ทำการวิเคราะห์เชิงตัวเลขเกี่ยวกับความแตกต่างของรันไทม์เมื่อเทียบกับการรีเซ็ตการแปลง แต่ฉันคิดว่ามันน่าจะมีประสิทธิภาพที่ดีขึ้นเล็กน้อย
NanoWizard

226

หากคุณกำลังวาดเส้นให้แน่ใจว่าคุณไม่ลืม:

context.beginPath();

ไม่เช่นนั้นเส้นจะไม่ถูกลบ


10
ฉันรู้ว่าสิ่งนี้อยู่ที่นี่มาระยะหนึ่งแล้วและอาจเป็นเรื่องโง่สำหรับฉันที่จะแสดงความคิดเห็นหลังจากเวลานี้ แต่สิ่งนี้รบกวนฉันมาหนึ่งปี ... โทรหาbeginPathคุณเมื่อคุณเริ่มเส้นทางใหม่อย่าคิดว่าเพียงเพราะคุณ กำลังล้างผืนผ้าใบที่คุณต้องการล้างเส้นทางที่มีอยู่ของคุณเช่นกัน! นี่จะเป็นการฝึกฝนที่น่ากลัวและเป็นวิธีการย้อนกลับของการวาดภาพ
Prestaul

ถ้าคุณต้องการล้างผืนผ้าใบของทุกสิ่ง ให้บอกว่าคุณกำลังสร้างเกมและคุณจำเป็นต้องวาดหน้าจอใหม่ทุก ๆ ร้อยวินาที

1
@JoseQuinones beginPathไม่ได้ล้างสิ่งใดออกจากผืนผ้าใบของคุณ แต่จะรีเซ็ตเส้นทางเพื่อให้รายการเส้นทางก่อนหน้าถูกลบออกก่อนที่คุณจะวาด คุณอาจจำเป็นต้องใช้ แต่เป็นการดำเนินการวาดภาพไม่ใช่การดำเนินการล้าง ล้างแล้วเริ่มแพทและวาดไม่ชัดเจนและเริ่มแพทแล้ววาด ความแตกต่างนั้นสมเหตุสมผลหรือไม่ ดูตัวอย่างได้ที่นี่: w3schools.com/tags/canvas_beginpath.asp
Prestaul

1
สิ่งนี้แก้ไขการชะลอตัวของอนิเมชั่นของฉันที่ฉันพบตลอดเวลา ฉันวาดเส้นกริดในทุกขั้นตอน แต่ไม่มีการล้างเส้นจากขั้นตอนก่อนหน้า
Georg Patscheider

118

คนอื่นทำได้ดีมากในการตอบคำถาม แต่ถ้าclear()วิธีการอย่างง่าย ๆในบริบทของวัตถุจะเป็นประโยชน์กับคุณ (สำหรับฉัน) นี่คือการดำเนินการที่ฉันใช้โดยใช้คำตอบที่นี่:

CanvasRenderingContext2D.prototype.clear = 
  CanvasRenderingContext2D.prototype.clear || function (preserveTransform) {
    if (preserveTransform) {
      this.save();
      this.setTransform(1, 0, 0, 1, 0, 0);
    }

    this.clearRect(0, 0, this.canvas.width, this.canvas.height);

    if (preserveTransform) {
      this.restore();
    }           
};

การใช้งาน:

window.onload = function () {
  var canvas = document.getElementById('canvasId');
  var context = canvas.getContext('2d');

  // do some drawing
  context.clear();

  // do some more drawing
  context.setTransform(-1, 0, 0, 1, 200, 200);
  // do some drawing with the new transform
  context.clear(true);
  // draw more, still using the preserved transform
};

6
นี่คือการดำเนินการที่ดี ฉันสนับสนุนการพัฒนาต้นแบบพื้นเมืองอย่างเต็มที่ แต่คุณอาจต้องการให้แน่ใจว่าไม่ได้กำหนด "ชัดเจน" ก่อนกำหนด - ฉันยังหวังว่าจะมีการใช้งานพื้นเมืองในบางวัน :) คุณรู้ไหมว่าเบราว์เซอร์ในวงกว้างสนับสนุน CanvasRenderingContext2D และปล่อยให้ "เขียนได้" ได้อย่างไร?
Prestaul

ขอบคุณสำหรับข้อเสนอแนะ @Prestaul - นอกจากนี้เบราว์เซอร์ไม่ควรป้องกันคุณจากการขยายวัตถุจาวาสคริปต์ในลักษณะนี้
JonathanK

@ JonathanK ฉันชอบที่จะเห็นโปรไฟล์ของความแตกต่างของประสิทธิภาพระหว่างการล้างด้วยและไม่รีเซ็ตการแปลง ฉันเดาว่าความแตกต่างจะชัดเจนหากคุณกำลังวาดรูปเล็ก ๆ น้อย ๆ แต่ถ้าสิ่งที่คุณกำลังวาดไม่สำคัญแล้วขั้นตอนที่ชัดเจนนั้นเล็กน้อยมาก ... ฉันอาจต้องทดสอบในภายหลังเมื่อฉันมีเวลามากขึ้น :)
Prestaul

ตกลงฉันทำโปรไฟล์แล้วและฉันจะเพิ่มรายละเอียดในโพสต์ของฉัน
Prestaul

35
  • Chrome ตอบสนองได้ดีกับ: context.clearRect ( x , y , w , h );ตามที่แนะนำโดย @ Pentium10 แต่ IE9 ดูเหมือนจะเพิกเฉยต่อคำแนะนำนี้อย่างสมบูรณ์
  • IE9 ดูเหมือนจะตอบสนองต่อ: canvas.width = canvas.width;แต่มันก็ไม่ได้เส้นที่ชัดเจนเพียงแค่รูปร่างรูปภาพและวัตถุอื่น ๆ เว้นแต่ว่าคุณจะใช้ @John Allsopp โซลูชันของการเปลี่ยนความกว้างเป็นครั้งแรก

ดังนั้นหากคุณมีแคนวาสและบริบทสร้างขึ้นเช่นนี้:

var canvas = document.getElementById('my-canvas');
var context = canvas.getContext('2d');

คุณสามารถใช้วิธีการเช่นนี้:

function clearCanvas(context, canvas) {
  context.clearRect(0, 0, canvas.width, canvas.height);
  var w = canvas.width;
  canvas.width = 1;
  canvas.width = w;
}

13
context.clearRect(0,0,context.canvas.width,context.canvas.height)โปรดทราบว่าวิธีการได้ง่ายโดยผ่านเฉพาะในบริบทและการใช้
Phrogz

5
IE 9 ควรตอบสนองต่อการโทร clearRect อย่างแน่นอน ... (ดูที่: msdn.microsoft.com/en-us/library/ff975407(v=vs.85).aspx ) ช้าเท่าการเปลี่ยน canvas.width คือวิธีเดียว คุณสามารถทำให้ช้าลงได้โดยการเปลี่ยนสองครั้งและเรียกใช้ clearRect เช่นกัน
Prestaul

1
ขออภัยฉันควรจะชัดเจนกว่า ... วิธีนี้จะใช้งานได้ (ตราบใดที่คุณยังไม่ได้ใช้การแปลง) แต่เป็นเทคนิค brute force [ช้า] ที่ไม่จำเป็น เพียงแค่ใช้ clearRect เพราะมันเร็วที่สุดและควรทำงานกับทุกเบราว์เซอร์ด้วยการติดตั้ง Canvas
Prestaul

1
ฉันเชื่อว่า IE กำลังวาดเส้นใหม่เนื่องจากพวกเขาอยู่ในบัฟเฟอร์ของเส้นทางยัง ฉันใช้รูปแบบนี้และใช้งานได้สมบูรณ์ function clearCanvas(ctx) { ctx.beginPath(); ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); }
DarrenMB

ฉันลองแต่ละวิธีก่อนหน้านี้ ... และนี่เป็นวิธีเดียวที่ทำงานได้ ฉันกำลังใช้ Chrome กับเส้นรูปสี่เหลี่ยมและข้อความ ... คงไม่คิดว่ามันจะยากที่จะทำสิ่งที่ควรสร้างขึ้น! ขอบคุณ!
Anthony Griggs

26

นี่คือปี 2018 และยังไม่มีวิธีดั้งเดิมในการล้างผืนผ้าใบอย่างสมบูรณ์สำหรับการวาดใหม่ clearRect() ไม่ได้ล้างผ้าใบอย่างสมบูรณ์ ภาพวาดประเภทที่ไม่ได้กรอกจะไม่ถูกล้างออก (เช่นrect())

1.To สมบูรณ์ผืนผ้าใบที่ชัดเจนโดยไม่คำนึงถึงวิธีการที่คุณวาด:

context.clearRect(0, 0, context.canvas.width, context.canvas.height);
context.beginPath();

จุดเด่น: ถนอมจังหวะสไตล์เติมสไตล์ ฯลฯ ไม่มีความล่าช้า

ข้อด้อย: ไม่จำเป็นถ้าคุณใช้ startPath แล้วก่อนที่จะวาดอะไร

2. การใช้ความกว้าง / ความสูงของการแฮ็ก:

context.canvas.width = context.canvas.width;

หรือ

context.canvas.height = context.canvas.height;

จุดเด่น: ทำงานร่วมกับ IE จุดด้อย: รีเซ็ต strokeStyle, fillStyle เป็น black; laggy;

ฉันสงสัยว่าทำไมวิธีแก้ปัญหาแบบดั้งเดิมไม่มีอยู่จริง ที่จริงแล้วclearRect()ถือเป็นโซลูชั่นบรรทัดเดียวเพราะผู้ใช้ส่วนใหญ่ทำbeginPath()ก่อนวาดเส้นทางใหม่ใด ๆ แม้ว่า startPath จะใช้เฉพาะในขณะที่วาดเส้นและไม่ได้ปิดเส้นทางเช่นrect().

นี่คือเหตุผลที่คำตอบที่ยอมรับไม่ได้แก้ปัญหาของฉันและฉันเสียชั่วโมงลองแฮ็คที่แตกต่างกัน สาปแช่งคุณโมซิลล่า


ฉันคิดว่านี่เป็นคำตอบที่ถูกต้องโดยเฉพาะอย่างยิ่งในการวาดผืนผ้าใบ ฉันทนทุกข์ทรมานจากบริบทที่เหลือจังหวะไม่ว่าฉันจะเรียก clearRect ในขณะที่ startPath ช่วย!
Shao-Kui

20

ใช้วิธี clearRect โดยส่งผ่าน x, y พิกัดและความสูงและความกว้างของผืนผ้าใบ ClearRect จะล้างผ้าใบทั้งหมดเป็น:

canvas = document.getElementById("canvas");
ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);

คุณสามารถใส่วิธีนี้และเรียกมันทุกครั้งที่คุณต้องการรีเฟรชหน้าจอแก้ไขให้ถูกต้อง

@ XXX.xxx โปรดตรวจสอบ id ของผืนผ้าใบใน html ของคุณและใช้เหมือนกันสำหรับบรรทัดแรก (เพื่อให้ได้องค์ประกอบตาม ID)
Vishwas

14

มีคำตอบที่ดีมากมายที่นี่ หมายเหตุเพิ่มเติมอีกอย่างหนึ่งคือบางครั้งมันก็สนุกที่จะล้างผืนผ้าใบเพียงบางส่วน นั่นคือ "เลือนหายไป" ภาพก่อนหน้าแทนที่จะลบออกทั้งหมด นี่สามารถให้เอฟเฟกต์เส้นทางที่ดี

มันเป็นเรื่องง่าย. สมมติว่าสีพื้นหลังของคุณเป็นสีขาว:

// assuming background color = white and "eraseAlpha" is a value from 0 to 1.
myContext.fillStyle = "rgba(255, 255, 255, " + eraseAlpha + ")";
myContext.fillRect(0, 0, w, h);

ฉันรู้ว่ามันเป็นไปได้และฉันไม่มีปัญหากับคำตอบของคุณฉันแค่สงสัยว่าถ้าคุณมีวัตถุ 2 ชิ้นที่เคลื่อนไหวและคุณต้องการติดตามหนึ่งในนั้นคุณจะทำอย่างไร
super

นั่นเป็นข้อตกลงที่ซับซ้อนกว่านี้มาก ในกรณีนั้นคุณควรสร้างผืนผ้าใบปิดหน้าจอและแต่ละเฟรมจะวาดวัตถุที่คุณต้องการให้ลากไปยังผืนผ้าใบนั้นโดยใช้วิธีการลบบางส่วนที่อธิบายไว้ที่นี่ วัตถุแล้วคอมโพสิตผืนผ้าใบปิดหน้าจอลงบนหลักโดยใช้ drawImage () คุณจะต้องตั้งค่า globalCompositeOperation เป็นสิ่งที่เหมาะสมสำหรับรูปภาพ เช่น "ทวีคูณ" จะทำงานได้ดีสำหรับวัตถุที่มืดบนพื้นหลังสีอ่อน
orion elenzil

12

วิธีที่รวดเร็วคือการทำ

canvas.width = canvas.width

IDK มันทำงานอย่างไร แต่มัน!


ว้าว. มันใช้งานได้จริงคุณเคยพบสิ่งนี้ได้อย่างไร
zipzit

@zipit เคล็ดลับเร็ว ๆ นี้ฉันพบว่าจาก medium.com หลังจากการล้างปกติไม่ได้แสดงผล :)
Jacob Morris

1
ฉันกำลังดึงผมพยายามที่จะเข้าใจว่าทำไมสิ่งนี้ถึงได้ผล! ขอบคุณสำหรับการแบ่งปัน!
aabbccsmith

ทุกคนสามารถอธิบายได้ว่าทำไมมันถึงทำงานได้และ canvas.width + = 0 ก็ทำหน้าที่นี้ด้วย
PYK

8

นี่คือสิ่งที่ฉันใช้โดยไม่คำนึงถึงขอบเขตและการแปลงเมทริกซ์:

function clearCanvas(canvas) {
  const ctx = canvas.getContext('2d');
  ctx.save();
  ctx.globalCompositeOperation = 'copy';
  ctx.strokeStyle = 'transparent';
  ctx.beginPath();
  ctx.lineTo(0, 0);
  ctx.stroke();
  ctx.restore();
}

โดยทั่วไปก็จะบันทึกสถานะปัจจุบันของบริบทและดึงพิกเซลโปร่งใสด้วยเป็นcopy globalCompositeOperationจากนั้นเรียกคืนสถานะบริบทก่อนหน้า


มันเหมาะกับฉัน ... ! ขอบคุณ
NomanJaved

6

สิ่งนี้ใช้ได้กับแผนภูมิวงกลมของฉันใน chart.js

<div class="pie_nut" id="pieChartContainer">
    <canvas id="pieChart" height="5" width="6"></canvas> 
</div>

$('#pieChartContainer').html(''); //remove canvas from container
$('#pieChartContainer').html('<canvas id="pieChart" height="5" width="6"></canvas>'); //add it back to the container

5

ฉันได้พบว่าในทุกเบราว์เซอร์ที่ฉันทดสอบวิธีที่เร็วที่สุดคือการเติมจริงด้วยสีขาวหรือสีใด ๆ ที่คุณต้องการ ฉันมีจอมอนิเตอร์ขนาดใหญ่มากและในโหมดเต็มหน้าจอ clearRect นั้นช้ามาก ๆ แต่ fillRect นั้นสมเหตุสมผล

context.fillStyle = "#ffffff";
context.fillRect(0,0,canvas.width, canvas.height);

ข้อเสียคือผ้าใบไม่โปร่งใสอีกต่อไป


4

ใน webkit คุณต้องตั้งค่าความกว้างเป็นค่าอื่นจากนั้นคุณสามารถตั้งค่ากลับเป็นค่าเริ่มต้น



4

วิธีที่เรียบง่าย แต่ไม่สามารถอ่านได้มากคือการเขียนสิ่งนี้:

var canvas = document.getElementId('canvas');

// after doing some rendering

canvas.width = canvas.width;  // clear the whole canvas

2

ฉันมักจะใช้

cxt.fillStyle = "rgb(255, 255, 255)";
cxt.fillRect(0, 0, canvas.width, canvas.height);

นี่เป็นวิธีที่ง่ายที่สุด! อย่างน้อยสำหรับฉัน
Jacques Olivier

1
context.clearRect(0,0,w,h)   

เติมสี่เหลี่ยมที่กำหนดด้วยค่า RGBA:
0 0 0 0: ด้วย Chrome
0 0 0 255: ด้วย FF & Safari

แต่

context.clearRect(0,0,w,h);    
context.fillStyle = 'rgba(0,0,0,1)';  
context.fillRect(0,0,w,h);  

ให้สี่เหลี่ยมเต็มไปด้วย
0 0 0 255
ไม่ว่าเบราว์เซอร์จะเป็นเช่นไร!




0

วิธีที่เร็วที่สุด:

canvas = document.getElementById("canvas");
c = canvas.getContext("2d");

//... some drawing here

i = c.createImageData(canvas.width, canvas.height);
c.putImageData(i, 0, 0); // clear context by putting empty image data

12
ว้าว ... ในเบราว์เซอร์ใด ในเหมือง (Chrome 22 และ Firefox 14 บน OS X) วิธีการของคุณคือตัวเลือกที่ช้าที่สุด jsperf.com/canvas-clear-speed/9
Prestaul

1
> 5 ปีในอนาคตนี้ยังคงเป็นวิธีที่ช้าที่สุดตามจำนวนเงินที่มีขนาดใหญ่มาก ~ 700x clearRectช้ากว่า
mgthomas99

0

หากคุณใช้ clearRect เท่านั้นถ้าคุณมีมันในรูปแบบที่จะส่งรูปวาดของคุณคุณจะได้รับการส่งแทนการล้างหรืออาจจะล้างได้ก่อนแล้วจึงอัพโหลดรูปวาดโมฆะดังนั้นคุณจะต้องเพิ่ม ป้องกันการผิดนัดที่เริ่มต้นของฟังก์ชั่น:

   function clearCanvas(canvas,ctx) {
        event.preventDefault();
        ctx.clearRect(0, 0, canvas.width, canvas.height);
    }


<input type="button" value="Clear Sketchpad" id="clearbutton" onclick="clearCanvas(canvas,ctx);">

หวังว่าจะช่วยใครซักคน


0

ฉันมักจะใช้สิ่งนี้

ctx.clearRect(0, 0, canvas.width, canvas.height)
window.requestAnimationFrame(functionToBeCalled)

บันทึก

การรวม clearRect และ RequestAnimationFrame ช่วยให้แอนิเมชั่นเหลวมากขึ้นถ้านั่นคือสิ่งที่คุณต้องการ


-2

ทั้งหมดนี้เป็นตัวอย่างที่ดีของวิธีที่คุณล้างผ้าใบมาตรฐาน แต่ถ้าคุณใช้ paperjs นี่จะใช้งานได้:

กำหนดตัวแปรส่วนกลางใน JavaScript:

var clearCanvas = false;

จาก PaperScript ของคุณกำหนด:

function onFrame(event){
    if(clearCanvas && project.activeLayer.hasChildren()){
        project.activeLayer.removeChildren();
        clearCanvas = false;
    }
}

ตอนนี้ทุกที่ที่คุณตั้งค่า clearCanvas ให้เป็นจริงมันจะเคลียร์ทุกรายการจากหน้าจอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.