2012-08-10 37 views
11

Tôi đang cố gắng sử dụng canvas HTML5 để vẽ đường màu đỏ ở bên trái của đường màu xanh lá cây. Đây là javascript của tôi:Tại sao tôi không thể vẽ hai dòng màu khác nhau trong canvas HTML5 của mình?

var canvas = document.createElement('canvas'); 
canvas.height = 150; 
canvas.width = 150; 
var canvasContext = canvas.getContext('2d'); 
canvasContext.beginPath(); 

// Draw the red line. 
canvasContext.strokeStyle = '#f00'; 
canvasContext.moveTo(10, 0); 
canvasContext.lineTo(10, 100); 
canvasContext.stroke(); 

// Draw the green line. 
canvasContext.moveTo(50, 0); 
canvasContext.strokeStyle = '#0f0'; 
canvasContext.lineTo(50, 100); 
canvasContext.stroke(); 

document.body.appendChild(canvas);​ 

Tuy nhiên, trong Google Chrome, tôi nhận được đường kẻ màu xanh đậm ở bên trái của đường kẻ màu xanh lục nhạt. Tại sao? Tôi gọi đột quỵ hai lần phải không? Do đó, tại sao cơn đột quỵ đầu tiên của tôi ảnh hưởng đến cơn đột quỵ thứ hai của tôi?

Here là một JSFiddle minh họa ý của tôi.

Trả lời

17

Bạn không gọi số canvasContext.beginPath(); khi bắt đầu vẽ dòng thứ hai của mình.

Để làm cho phần vẽ độc lập hơn, tôi đã thêm khoảng trắng:

var canvas = document.createElement('canvas'); 
canvas.height = 150; 
canvas.width = 150; 

var canvasContext = canvas.getContext('2d'); 

// Draw the red line. 
canvasContext.beginPath(); 
canvasContext.strokeStyle = '#f00'; 
canvasContext.moveTo(10, 0); 
canvasContext.lineTo(10, 100); 
canvasContext.stroke(); 

// Draw the green line. 
canvasContext.beginPath(); 
canvasContext.moveTo(50, 0); 
canvasContext.strokeStyle = '#0f0'; 
canvasContext.lineTo(50, 100); 
canvasContext.stroke(); 

document.body.appendChild(canvas); 

Demo: http://jsfiddle.net/AhdJr/2/

+0

Cảm ơn, nếu đó là trường hợp, tôi có một câu hỏi thứ 2: Tại sao dòng bên trái lại tối hơn cái kia? Tôi đã không đặt giá trị độ mờ cho cả hai dòng, vậy tại sao canvas lại pha trộn các màu? – dangerChihuahua007

+0

Tôi thành thật không biết. Nhìn vào [tài liệu] (http://dev.w3.org/html5/2dcontext/#dom-context-2d-beginpath), có vẻ như 'beginPath()' xóa đường dẫn con, vì vậy có thể dòng thứ hai là (bằng cách nào đó) một sự kết hợp của cái trước và cái hiện tại. – Blender

+0

Tôi nghĩ nó bởi vì bạn vẽ nó hai lần, nếu bạn loại bỏ đột quỵ ban đầu, cả hai sẽ cùng màu, mặc dù điều này vẫn còn lạ, tôi không nghĩ rằng bộ đệm khung bị xóa, khi bạn gọi đột quỵ nhiều lần, hoặc một cái gì đó để làm với độ mờ mặc định. –

3

rất thú vị như xa như tôi có thể nói đường webgl hoặc làm việc OpenGL cũng giống như một máy nhà nước lớn, nơi bạn định nghĩa một nhà nước, vẽ, cập nhật trạng thái các vẽ một lần nữa, và vân vân ...

Mặc dù Tôi không chắc liệu canvas có tuân theo các nguyên tắc giống nhau hay không ngay cả khi nó chỉ có nghĩa là đối với các kết xuất 2d đơn giản.

Tôi quản lý để ge nó hoạt động chỉ đơn giản là bắt đầu một con đường mới.

var canvas = document.createElement('canvas'); 
canvas.height = 150; 
canvas.width = 150; 
var canvasContext = canvas.getContext('2d'); 
canvasContext.beginPath(); 

// Draw the red line. 

canvasContext.moveTo(10, 0); 
canvasContext.lineTo(10, 100); 
canvasContext.strokeStyle = '#FF0000'; 
canvasContext.stroke(); 

canvasContext.beginPath(); // begin new path 
// Draw the green line. 
canvasContext.moveTo(50, 0); 
canvasContext.strokeStyle = '#00FF00'; 
canvasContext.lineTo(50, 100); 
canvasContext.stroke(); 

document.body.appendChild(canvas);​ 

Tôi có kinh nghiệm hạn chế với webgl vì vậy nếu Im nhầm, hãy sửa tôi.

+0

Tôi khá chắc chắn rằng các yếu tố Canvas và WebGL những điều khác nhau. – Blender

+0

@Blender vâng tôi nghĩ rằng thực hiện của họ khác nhau Im không chắc chắn nếu vải theo nguyên tắc tương tự * gl theo, nó chỉ trông giống như nó từ các mã ví dụ khi so sánh với opengl, bạn biết như nhận bối cảnh thiết lập màu sắc và như vậy, Tôi thực sự không thể chắc chắn, cảm ơn. –

Các vấn đề liên quan