1.2 도형변환 Ÿ 캔버스의좌표계의이동, 회전및확대 / 축소기능을통한도형의변환을제공한다. Ÿ translate() 메서드는좌표공간의시작점을 (x,y) 로이동한다. Ÿ rotate() 메서드는좌표공간을시계방향으로회전한다. Ÿ scale() 메서드는좌표공간을수평 / 수직방

Similar documents
쉽게 풀어쓴 C 프로그래밍

예제 <!DOCTYPE html><html><head> <script type="text/javascript"> function arcto() { var canvas = document.getelementbyid('canvas'); context = canvas.get

Ÿ 캔버스의크기와드로잉표면의크기 <canvas> 요소의 width/height 속성사용하여변경하면캔버스크기를드로잉표면의크기로자동변경한다. CSS를사용해서캔버스크기를지정하는경우는드로잉표면의크기는변경할수없기때문에캔버스와드로잉표면의불일치로인하여예기치않은결과를발생시킬수있음에주

PowerPoint 프레젠테이션

HTML5-11강 캔버스2 - 드로잉 확장

01장 웹 개요와 실습 환경 구축

쉽게 풀어쓴 C 프로그래밍

HTML5-³¹Àå¿ë.PDF

PowerPoint Presentation

HTML5

Microsoft PowerPoint - web-part01-ch10-문서객체모델.pptx

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

이장에서다룰내용 테두리를제어하는스타일시트 외부여백 (Margin) 과내부여백 (Padding) 관련속성 위치관련속성 2

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

Lab10

PowerPoint 프레젠테이션

Microsoft PowerPoint - logo_2-미해답.ppt [호환 모드]

e-비즈니스 전략 수립

Building Mobile AR Web Applications in HTML5 - Google IO 2012

Microsoft PowerPoint - web-part02-ch15-문서객체조작.pptx

HTML5

쉽게 풀어쓴 C 프로그래밍

Javascript

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

PowerPoint Template

1989 Tim Berners-Lee invents the Web with HTML 1991 First Web Browser Released HTML Tags Specification Released 1994 First World Wide Web Conference H

슬라이드 1

Visual Basic 반복문

PowerPoint 프레젠테이션

02 장. 글꼴문단지정하기 이번장에서는스타일시트속성중에서글꼴과관련한속성과문단에관련된속성을살펴보도록하자.

Ÿ column-rule 속성은단사이의구분선을표현하기위한속성으로 column-rule-color, column-rule-style, column-rule-width 속성을한번에지정할수있다. 1.4 단의확장 Ÿ column-span 속성은다단을구성할때해당요소가얼마나많은단

PowerPoint 프레젠테이션

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

PowerPoint Presentation

XSS Attack - Real-World XSS Attacks, Chaining XSS and Other Attacks, Payloads for XSS Attacks

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Javascript.pages

윈도우즈프로그래밍(1)

PowerPoint 프레젠테이션

Microsoft PowerPoint 세션.ppt

쉽게 풀어쓴 C 프로그래밍

Structure and Interpretation of Computer Programs: Assignment 3 Seung-Hoon Na October 4, George (아래 3개의 문제에 대한 구현이 모두 포함된 george.rkt파일을 제출하시오.

슬라이드 1

로거 자료실

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

쉽게 풀어쓴 C 프로그래밍

혼자서일을다하는 JSP. 이젠일을 Servlet 과나눠서한다. JSP와서블릿의표현적인차이 - JSP는 <html> 내에서자바를사용할수있는수단을제공한다. - 서블릿은자바내에서 <html> 을작성할수있는수단을제공한다. - JSP나서블릿으로만웹페이지를작성하면자바와다양한코드가

Week8-Extra

Open GL

PowerPoint 프레젠테이션

슬라이드 1

AMP는 어떻게 빠른 성능을 내나.key

PowerPoint Presentation

슬라이드 1

Microsoft PowerPoint - C++ 5 .pptx

gnu-lee-oop-kor-lec06-3-chap7

Ext JS À¥¾ÖÇø®ÄÉÀ̼ǰ³¹ß-³¹Àå.PDF

tkinter를 이용한 계산기 구현

LIDAR와 영상 Data Fusion에 의한 건물 자동추출

Lab1

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint 프레젠테이션

HTML5

HTML5

PowerPoint 프레젠테이션

제8장 자바 GUI 프로그래밍 II

chap 5: Trees

Vector Differential: 벡터 미분 Yonghee Lee October 17, 벡터미분의 표기 스칼라미분 벡터미분(Vector diffrential) 또는 행렬미분(Matrix differential)은 벡터와 행렬의 미분식에 대 한 표

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

HTML5

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - web-part03-ch20-XMLHttpRequest기본.pptx

Microsoft PowerPoint - web-part01-ch09-브라우저객체모델.pptx

API 매뉴얼

PowerPoint Presentation

Javascript

미쓰리 파워포인트

SOFTBASE XFRAME DEVELOPMENT GUIDE SERIES HTML 연동가이드 서울특별시구로구구로 3 동한신 IT 타워 1215 호 Phone Fax Co

adfasdfasfdasfasfadf

TViX_Kor.doc

WebGL 레슨 3 - 회전 운동

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

HTML5 인터넷보충학습자료 (2014) 14 강. HTML API [1] : 오프라인웹, 파일접근, 웹스토리지 14 강. HTML API [1] : 오프라인웹, 파일접근, 웹스토리지 1. 오프라인웹 1.1 오프라인웹애플리케이션 Ÿ 오프라인상태에서도사용이가능한애플리케이

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint 프레젠테이션

Microsoft PowerPoint - web-part02-ch16-이벤트.pptx

<4D F736F F F696E74202D20C1A63233C0E520B1D7B7A1C7C820C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

JU-TF43

Microsoft PowerPoint Predicates and Quantifiers.ppt

PowerPoint Presentation

xlogo 1.0 beta version < 기본중의기본 > 1. 키워드 ( 명령어 ) 는변수명으로사용될수없다. 2. 키워드는대소문자를구분하지않고사용할수있다. 3. 변수명은대소문자를구분한다. 4. 변수를명시적으로정의하는과정필요없이값을대입하는순간변수정의되고, 대입한값의성

UI TASK & KEY EVENT

SOFTBASE XFRAME DEVELOPMENT GUIDE SERIES ActiveX 컴포넌트가이드 서울특별시구로구구로 3 동한신 IT 타워 1215 호 Phone Fax

Microsoft PowerPoint - chap06-1Array.ppt

SW

1 SW

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

PowerPoint Presentation

Transcription:

1. 도형합성및변환 1.1 도형합성 1.1.1 globalcompositeoperation 속성값 Ÿ globalcompositeoperation 속성을설명하면다양한기본합성동작을지정할수있다. 이속성을이용함으로써도형이그려진순서와상관없이겹쳐지는부분에대한처리가가능하다. 예제 <!DOCTYPE html><html><head> <script type="text/javascript"> function attr_values() { var canvas = document.getelementbyid('canvas'); context = canvas.getcontext('2d'); context.beginpath(); context.fillstyle = 'green'; context.fillrect(10, 10, 100, 100); context.globalcompositeoperation = 'lighter'; context.fillstyle = 'red'; context.arc(110, 110, 50, 0, 360*Math.PI/180, true); context.fill(); <body onload="attr_values();"> <canvas id="canvas" width="170" height="170" style="border:solid 1px #000000"> canvas 사용하기 </canvas> </body> </html> - 1 -

1.2 도형변환 Ÿ 캔버스의좌표계의이동, 회전및확대 / 축소기능을통한도형의변환을제공한다. Ÿ translate() 메서드는좌표공간의시작점을 (x,y) 로이동한다. Ÿ rotate() 메서드는좌표공간을시계방향으로회전한다. Ÿ scale() 메서드는좌표공간을수평 / 수직방향으로좌표공간을확대 / 축소한다. 예제도형변환 <!DOCTYPE html> <html><head> function polygon(context, x, y, radius, sides, startangle, anticlockwise) { if (sides < 3) return; //3각형이하는그리지않도록한다. var degree = (Math.PI * 2)/sides; degree = anticlockwise? -degree : degree; context.save(); // 드로잉상태를저정한다. context.translate(x,y); // 드로잉좌표공간을다각형중심좌표로이동한다. context.rotate(startangle); // 시작각도를중심으로그리도록하기위하여회전한다. context.moveto(radius,0); // 다각형의시작위치로이동한다. for (var i = 1; i < sides; i++) { // 면의수만큼루프를반복한다 context.lineto(radius*math.cos(degree*i),radius*math.sin(degree*i)); context.closepath(); // 패스를닫는다. context.restore(); // 기존드로잉상태를복구한다. function ScaleMirror() { // 그린도형을서로마주보게만든다. var canvas = document.getelementbyid("mycanvas"); var context = canvas.getcontext("2d"); context.linewidth = 10; context.linejoin = "round" context.fillstyle = "rgba(227,11,93,1.0)"; - 2 -

//polygon 메서드를사용하여삼각형을그린다. context.beginpath(); polygon(context,120, 120, 100, 3, (90 * Math.PI/2), false); context.stroke(); context.fill(); context.translate(canvas.width, 0); // 캔버스의중심으로중앙으로이동시킨다. context.scale(-1, 1);// 그리는방향을수평반대방향으로그리도록한다. //polygon 메서드를사용하여동일한조건으로삼각형을하나더그린다. polygon(context,120, 120, 100, 3, (90 * Math.PI/2), false); context.stroke(); context.fill(); <body onload="scalemirror();"> <canvas id="mycanvas" width="400" height="250" style="border: 10px inset #aaa"> 캔버스연습 </canvas> </body></html> 1.2.1 사용자정의변환 Ÿ 캔버스컨텍스트에서는변환행렬을직접조작할수있도록 transform() 메서드와 settransform() 메서드를제공한다. Ÿ transform() 메서드가지정된인수로행렬로현재변환행렬에적용시키기때문에연속해서이메서드를호출하면변환행렬값이누적된다. 반면에 settransform() 메서드는위에언급한바와같이현재변환행렬을원래값인단위행렬로재설정한다음 transform() 메서드를호출한다. 따라서이메서드를호출할때마다매번새로운변환행렬이적용된다. - 3 -

예제사용자정의변환 <!DOCTYPE html><html><head> function Transformation() { var canvas = document.getelementbyid('mycanvas'); var context = canvas.getcontext('2d'); var colors = new Array("red", "orange", "yellow", "green", "blue", "navy", "purple"); context.linewidth = 10; for (var i = 0; i <colors.length; i++) { // 호를반복해서그리도록한다. context.transform (1, 0, 0, 1, 0, 10); // 아래쪽으로 10픽셀만큼이동하는변환행렬 context.strokestyle = colors[i]; // 색상을적용시킨다. context.beginpath(); context.arc(200, 250, 250, 0, Math.PI, true); context.stroke(); <body onload="transformation();"> <canvas id="mycanvas" width="400" height="200" style="border: 10px inset #aaa"> 캔버스연습 </canvas> </body></html> 2. 텍스트그리기 2.1 텍스트테두리및채우기 Ÿ context.filltext( text, x, y [, maxwidth ] ) 는지정된위치에색이채워진텍스트를삽입한다. maxwidth가지정된경우, 텍스트는 maxwidth 폭크기에맞게조정된텍스트를채운다. Ÿ context.stroketext( text, x, y [, maxwidth ] ) 는지정된위치에테두리만있는텍스트를삽입한다. Ÿ context.measuretext( text ) 는현재글꼴에서주어진텍스트의폭을반환한다. 예제 텍스트테두리및채우기 <!DOCTYPE html><html><head> function filltext() { var canvas = document.getelementbyid('mycanvas'); var context = canvas.getcontext('2d'); - 4 -

gradient = context.createlineargradient(0, 0, 600, 0); gradient.addcolorstop("0", "magenta"); gradient.addcolorstop(".25", "blue"); gradient.addcolorstop(".50", "green"); gradient.addcolorstop(".75", "yellow"); gradient.addcolorstop("1.0", "red"); context.fillstyle = gradient; context.font = "50pt 궁서체 "; context.strokestyle = "red"; context.linewidth = 2; context.stroketext(" 컴퓨터과학 HTML5", 20, 65); context.filltext(" 컴퓨터과학 HTML5", 20, 140); context.fillstyle = 'blue'; context.stroketext(" 컴퓨터과학 HTML5", 20, 210); context.filltext(" 컴퓨터과학 HTML5", 20, 210); <body onload="filltext();"> <canvas id="mycanvas" width="600" height="400" > 캔버스연습 </canvas> </body> </html> 2.2 글꼴설정및텍스트배치 Ÿ context.font는현재글꼴의설정값을반환한다. font 속성값은글자스타일, 글자크기, 글꼴등으로지정할수있다. context.font = italic 15pt 굴림체 2.2.1 textalign 속성 Ÿ 현재텍스트의수평에대한맞춤 ( 정렬 ) 설정값을반환한다. 텍스트의맞춤을변경하기위하여설정될수있고, 기본값은 start이다. 지정할수있는값은 left, right, center, start, end이다. - 5 -

2.2.2 textbaseline 속성 Ÿ 현재텍스트의수직에대한기준선을지정한다. 수직위치의기준정렬을변경하기위하여설정될수있고, 기본값은 alphabetic이다. 지정할수있는값은 top, hanging, middle, alphabetic, ideographic, bottom이다. 예제 텍스트그리기 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <script type="text/javascript"> function arcto() { var canvas = document.getelementbyid("mycanvas"); var context = canvas.getcontext("2d"); context.font = "bold 40pt 궁서체 "; context.textalign = 'left'; context.textbaseline = 'top'; context.filltext(" 대한민국 ", 200, 100); context.font = "italic 50pt 굴림체 "; context.textalign = 'center'; context.textbaseline = 'bottom'; context.stroketext(" 대한민국 ", 200, 200); <body onload="arcto();"> <canvas id="mycanvas" width="500" height="400" >canvas 사용하기 </canvas> </body> </html> 3 이미지처리 3.1 이미지삽입관련메서드 Ÿ 이미지를그리기위해서는 drawimage() 메서드를사용하고, 이미지의일부나전체, 또는확대및축소하여캔버스어디든지그릴수있다. - 6 -

3.1.1 이미지삽입 Ÿ context.drawimage( 이미지, dx, dy) 는지정한이미지를원래크기로삽입한다. Ÿ context.drawimage( 이미지, dx, dy, dw, dh) 는이미지를지정한크기로삽입한다. Ÿ context.drawimage( 이미지, sx, sy, sw, sh, dx, dy, dw, dh) 는이미지의일부분을잘라내어삽입한다. 예제 <!DOCTYPE html><html><head> function drawimage() { var canvas = document.getelementbyid('mycanvas'); var context = canvas.getcontext('2d'); var img = new Image(); img.src = 'image.jpg'; img.onload = function(e) { context.drawimage(img, 10, 10, 380, 280); <body onload="drawimage();"> <canvas id="mycanvas" width="400" height="300" style="border: 10px inset #aaa"> 캔버스연습 </canvas> </body></html> - 7 -

3.1.2 이미지삽입예제 <!DOCTYPE html><html> <head> function drawimage() { var canvas = document.getelementbyid('mycanvas'); var context = canvas.getcontext('2d'); var img = new Image(); img.src = 'android.jpg'; img.onload = function(e) { context.drawimage(img, 10, 10); context.drawimage(img, 200, 10, 300, 300); context.drawimage(img, 10, 10, 100, 100, 550, 10, 100, 300); context.beginpath(); context.setlinedash([3,1]); context.linewidth =2; context.strokestyle="blue"; context.strokerect(200, 10, 300, 300); context.strokerect(550, 10, 100, 300); <body onload="drawimage();"> <canvas id="mycanvas" width="660" height="320" style="border: 2px inset #aaa"> 캔버스연습 </canvas> </body></html> 3.2 이미지조작 Ÿ 이미지데이터메서드를사용하면이미지의각픽셀에접근해서다양한조작을할수있다. createimagedata() 메서드를사용하여비어있는이미지에객체를생성할수있 - 8 -

Ÿ Ÿ Ÿ 다. getimagedata() 메서드를사용하여이미지픽셀에접근하고 putimagedata() 메서드를사용하여픽셀을다시이미지에넣을수있다. imagedata= context.createimagedata(sw, sh), imagedata = context.createimagedata( 이미지데이터 ) 는모든픽셀이투명한검은색으로초기화된 ImageData 객체를생성한다. imagedata = context.getimagedata(sx, sy, sw, sh) 는캔버스영역에지정된사각형영역에대한이미지를포함한 ImageData 객체를반환한다. context.putimagedata( 이미지데이터, dx, dy) 는캔버스에지정된 ImageData 객체의데이터를그린다. 3.2.1 이미지데이터처리 Ÿ 다음은 ImageData 객체를생성하는방법을나타낸것이다. imagecopy = context.createimagedata( canvas.width, canvas.height ) Ÿ 다음은캔버스영역에지정한영역에서 (0,0) 캔버스크기만큼 (canvas.width, canvas.height) 의이미지데이터를 imagedata 객체에반환하는방법을나타낸것으로, 캔버스에서이미지데이터를가져옴으로써, 이미지조작을자유자재로할수있다. imagedata = context.getimagedata( 0, 0, canvas.width, canvas.height ) Ÿ 생성된이미지배열데이터를복사하거나조작하기위해서는다음과같이반복문을통해서처리하게된다. for (var i=0; i < imagedata.data.length; i++) imagecopy.data[i] = imagedata.data[i]; Ÿ 가져온이미지데이터의배열을조작한다. for (var i=3; i < imagedata.data.length-4; i+=4) imagedata.data[i] = imagedata.data[i] / 2; Ÿ for (var i=0; i < imagedata.data.length-4; i+=4) { average = ( imagedata.data[i]+imagedata.data[i+1]+imagedata.data[i+2] ) / 3; imagedata.data[i] = imagedata.data[i+1] = imagedata.data[i+2] = average; 캔버스에서가져온이미지데이터를복사한후캔버스영역에출력하도록한방법을나타낸것이다. context.putimagedata ( imagecopy, 0, 0 ) 3.2.2 이미지데이터처리 Ÿ putimagedata() 메서드는이미지데이터의원하는부분만캔버스에출력할수있는기능을제공하고있다. 추가적인옵션 dirty* 를지정한다면이미지데이터의원하는 - 9 -

부분만을캔버스에출력할수있다. 예제이미지데이터처리 <!DOCTYPE html><html><head> <script type="text/javascript" src="canvas_lab.js"> function copyimage() { var canvas = document.getelementbyid('mycanvas'); var context = canvas.getcontext('2d'); // 그리는도형의그림자효과를설정한다. context.shadowblur = 5; context.shadowoffsetx = 5; context.shadowoffsety = 5; context.shadowcolor = 'rgba(0,0,0,0.75)'; // 다각형을그린다. context.beginpath(); context.strokestyle = "black" drawpolygon(context, 100, 100, 80, 8, Math.PI/2, false); // 팔각형외부를그린다 drawpolygon(context, 100, 100, 40, 8, Math.PI/2, true); // 팔각형내부를그린다 context.fillstyle="rgba(227,11,93,0.75)"; context.fill(); // 별을그린다. context.beginpath(); drawstar(context, 300, 100, 90, false); // 바깥쪽별을그린다. drawstar(context, 300, 100, 50, true); // 안쪽별을그린다. context.fillstyle="rgba(11,227,93,0.75)"; context.fill(); canvas.addeventlistener("click", function (){ // 캔버스의마우스클릭시 var canvas2 = document.getelementbyid("yourcanvas"); var context2 = canvas2.getcontext("2d"); - 10 -

// 캔버스에그려진이미지데이터를가져온다. var imagebuffer = context.getimagedata(0, 0, canvas.width, canvas.height); // 이미지데이터를원하는영역만다른캔버스에출력한다. context2.putimagedata(imagebuffer, 0, 0, 100, 0, 200, 200);, false); <body onload="copyimage();"> <canvas id="mycanvas" width="400" height="200" style="border: 10px inset #aaa"> 캔버스연습 </canvas> <canvas id="yourcanvas" width="400" height="200" style="border: 10px outset #aaa"> 캔버스연습 </canvas> <p> 왼쪽캔버스를마우스로클릭하면오른쪽캔버스에이미지를복사합니다.</p> </body> </html> 3.3 이미지데이터저장 Ÿ url = canvas.todataurl(type, quality) 은캔버스에그려진내용을 URL 문자열로반환해주는기능을제공한다. type은이미지의종류 ( image/jpeg, image/png ) 를나타내고 quality는이미지의품질을나타내는것으로 0.0 ~ 1.0( 손실이없는가장좋은품질 ) 사이의실수값을지정해야한다. 3.4 클리핑영역지정 Ÿ 캔버스영역에서드로잉을제한하도록해주는패스로정의된특수한영역을말한다. 컨텍스트가초기화될때, 클리핑영역의크기와캔버스의크기는동일하게된다. 클리핑영역은현재의클리핑영역과현재패스에서그려진영역이겹치는부분을계산하여새로운클리핑영역으로생성한다. Ÿ 클링핑영역은원하는클리핑모양의패스를지정한다음, clip() 메서드를호출하면된다. Ÿ 클리핑영역을설정한후 clearrect() 메서드를호출하면지워지는영역이클리핑영역으로제한된다. - 11 -

4. 애니메이션 4.1 기존방법의문제 Ÿ 애니메이션은 settimeout() 메서드나 setinterval() 메서드를사용한다. settimeout() 메서드는특정시간에처리할함수를한번만호출한다. setinterval() 메서드는특정시간마다처리할함수를반복적으로호출한다. Ÿ 이러한메서드들의문제는애니메이션을업데이트하기위한최적의주기가무엇인지모르기때문에개발자는가장간단한방법으로최소한의시간으로고정시킨다. 이러한방법들은과도한그리기로인한프레임손실, CPU주기가낭비되는등의문제가발생한다. Ÿ window 객체의 requestanimationframe() 및 cancelanimationframe() 메서드사용하도록한다. 4.2 스크립트기반애니메이션용타이밍컨트롤 Ÿ 캔버스에서는 requestanimationframe() 및 cancelanimationframe() 메서드를사용하여애니메이션을구현한다. 이메서드는브라우저가페이지디스플레이를업데이트해야할때만사용자애플리케이션에알리도록할수있으므로프레임손실문제를해결할수있다. Ÿ requestanimationframe() 메서드는다음애니메이션프레임을그릴준비가되면브라우저에게특정콜백을호출할수있도록요청한다. 다음애니메이션을그릴시간을알필요가없는장점이있다. requestid = window.requestanimationframe() Ÿ cancelanimationframe() 메서드는애니메이션프레임을업데이트하도록이전에예약되어있는콜백요청을취소하는데사용된다. window.cancelanimationframe( requestid ) 예제캔버스에서애니메이션구현 <!DOCTYPE html><html ><head> function drawimage() { var canvas = document.getelementbyid('mycanvas'); var context = canvas.getcontext('2d'); var requestid = 0; var x = 25, y = 25, rectwidth = 50, speed = 5; context.fillstyle="rgba(11,227,93,0.75)"; context.fillrect(x, y, rectwidth, rectwidth); function draw() { context.clearrect(0, 0, canvas.width, canvas.height); context.fillrect(x, y, rectwidth, rectwidth); - 12 -

function animate() { requestid = window.requestanimationframe(animate); x += speed; if(x <= 0 x >= (canvas.width - rectwidth)){ speed = -speed; draw(); canvas.addeventlistener("click", function (){ // 캔버스의이벤트리스너에서마우스클릭 if(requestid > 0) { // 애니메이션이동작중일때 window.cancelanimationframe(requestid); // 애니메이션을정지한다.. requestid = 0; // 핸들번호를초기화시킨다. else { // 애니메이션이정지상태이면다시시작한다. requestid = window.requestanimationframe(animate);, false); <body onload="drawimage();"> <canvas id="mycanvas" width="500" height="100" style="border: 10px inset #aaa"> 캔버스연습 </canvas> </body></html> - 13 -