| sitelink1 | http://blog.naver.com/shadowbug/220741582977 | 
|---|---|
| sitelink2 | |
| sitelink3 | |
| sitelink4 | |
| extra_vars5 | |
| extra_vars6 | 
아래 예제는 모든 클릭한 지점에 원이 그려지는 이벤트를 작성한다.
HTML 파일
초기화 이벤트와 클릭시 이벤트를 처리한다.
- 
	<body onload="load(this)"> 
- 
	<canvas id="draw" onclick="draw(event)" width="500px" height="500px;"></canvas> 
- 
	</body> 
javascript
load 함수는 배경 이미지를 그려주는 이벤트이다.
draw 함수는 클릭했을 때 배열에 클릭 지점을 저장하고, 배경을 그리고 모든 클릭한 지점에 원을 그려주는 예제이다.
버퍼에 그림을 그리고, 마지막에 실제 캔버스에 그림을 그림으로서 깜박이는 효과를 제거하였다.
- 
	// 클릭한 위치를 저장하는 배열 
- 
	var ptList = new Array(); 
- 
	
- 
	// ctx, buffer ctx 
- 
	var ctx = null; 
- 
	var bufCtx = null; 
- 
	
- 
	// 초기 이미지 
- 
	var img = new Image(); 
- 
	
- 
	function load(target) { 
- 
	// 실제로 그려지는 위치의 캔버스 생성 
- 
	var canvas = document.getElementById("draw"); 
- 
	ctx = canvas.getContext("2d"); 
- 
	
- 
	// 버퍼링용 캔버스 생성 
- 
	var bufCanvas = document.createElement("canvas"); 
- 
	bufCtx = bufCanvas.getContext("2d"); 
- 
	
- 
	// 버퍼 크기 설정 
- 
	bufCtx.canvas.width = ctx.canvas.width; 
- 
	bufCtx.canvas.height = ctx.canvas.height; 
- 
	
- 
	// 이미지 로드 
- 
	img = new Image(); 
- 
	img.src = "/example-canvas/test.jpg"; 
- 
	img.onload = function() { 
- 
	// 이미지가 로딩 완료시 이미지를 그려줘야 이미지가 나온다. 
- 
	
- 
	// 처음 이미지 그림 
- 
	// 이미지를 버퍼에 그림 
- 
	bufCtx.drawImage(img, 0, 0); 
- 
	// 버퍼를 캔버스에 그림 
- 
	ctx.drawImage(bufCtx.canvas, 0, 0); 
- 
	} 
- 
	} 
- 
	
- 
	
- 
	function draw(event) { 
- 
	// 이벤트가 발생된 dom 객체의 좌표를 기준으로 한다. 
- 
	var x = (event.offsetX == undefined ? event.layerX : event.offsetX); 
- 
	var y = (event.offsetY == undefined ? event.layerY : event.offsetY); 
- 
	var pos = new Object(); 
- 
	pos.x = x; 
- 
	pos.y = y; 
- 
	// 클릭 지점 저장 
- 
	ptList.push(pos); 
- 
	
- 
	// 이미지를 버퍼에 그림 
- 
	bufCtx.drawImage(img, 0, 0); 
- 
	
- 
	for(var i=0; i<ptList.length; i++) { 
- 
	var pt = ptList[i]; 
- 
	
- 
	// 클릭 지점에 원을 그림 
- 
	bufCtx.beginPath(); 
- 
	bufCtx.arc(pt.x, pt.y, 10, 0, 2*Math.PI, true); 
- 
	bufCtx.closePath(); 
- 
	bufCtx.stroke(); 
- 
	} 
- 
	
- 
	// 버퍼를 캔버스에 그림 
- 
	ctx.drawImage(bufCtx.canvas, 0, 0); 
- 
	
- 
	} 
- 
	
- 
	
- 
	
Q ) 왜 더블버퍼링 로직을 클릭 이벤트시에 처리하는가?
일반적인 UI 프로그래밍시 draw 이벤트를 제공하여
이 때 그림을 그려주어야 이미지가 invalidate되더라도 다시 복원이 된다.
하지만 HTML은 캔버스에 이미지가 그려질 경우 자동적으로 이미지를 복원해 주기 때문에,
클릭시 이미지를 그려주면 된다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 | 
|---|---|---|---|---|
| 68 | Canvas 도형의 클릭 이벤트 처리 | 황제낙엽 | 2016.08.22 | 514 | 
| 67 | Canvas 이미지 추출 | 황제낙엽 | 2016.08.22 | 327 | 
| » | Canvas 더블버퍼링 | 황제낙엽 | 2016.08.22 | 441 | 
| 65 | Canvas 비트맵 그리기   | 황제낙엽 | 2016.08.22 | 265 | 
| 64 | Canvas 그라디언트 그리기   | 황제낙엽 | 2016.08.22 | 249 | 
| 63 | Canvas 텍스트 그리기   | 황제낙엽 | 2016.08.22 | 247 | 
| 62 | Canvas 곡선 그리기   | 황제낙엽 | 2016.08.22 | 658 | 
| 61 | Canvas 다각형 그리기   | 황제낙엽 | 2016.08.22 | 345 | 
| 60 | Canvas 사각형 그리기   | 황제낙엽 | 2016.08.22 | 269 | 
| 59 | Canvas 시작하기   | 황제낙엽 | 2016.08.22 | 260 | 
| 58 | HTML5 개발을 도와주는 도구들 | 황제낙엽 | 2014.04.04 | 209 | 
| 57 | encoding, charset, code page, UTF-8, UNICODE ...   | 황제낙엽 | 2013.08.07 | 1007 | 
| 56 | document.domain (from mozilla.org) | 황제낙엽 | 2013.03.13 | 814 | 
| 55 | 우리은행 웹 접근성 가이드   | 황제낙엽 | 2013.03.08 | 268 | 
| 54 | 모든 브라우저에서 동작하는 opacity 설정 코드 | 황제낙엽 | 2013.02.14 | 249 | 
| 53 | DXImageTransform.Microsoft.AlphaImageLoader 와 file dialog | 황제낙엽 | 2013.01.28 | 397 | 
| 52 | Gradient 와 Background-Image 동시 적용 방안 | 황제낙엽 | 2013.01.11 | 387 | 
| 51 | 그라디언트와 다중 배경 (gradient)   | 황제낙엽 | 2013.01.11 | 279 | 
| 50 | CSS Gradient Background Maker   | 황제낙엽 | 2013.01.11 | 265 | 
| 49 | Radius, Gradient, Padding | 황제낙엽 | 2013.01.11 | 267 | 
 
							