'html5'에 해당되는 글 4건

  1. 2011/10/12 audio 엘리먼트의 onplay 이벤트 처리 시 주의사항
  2. 2011/09/08 캔버스 리사이즈 시 주의할 점
  3. 2011/08/22 캔버스 복사하기
  4. 2010/03/11 HTML5 (2)
발생일: 2011.10.12

문제:
버튼을 클릭하면 오디오가 재생되고, 오디오 재생 상태에 따라 버튼의 모양을 변경하려고 한다.

<audio> 엘리먼트의 onplay / onended 이벤트를 컨트롤 해서,
재생될 때 아이콘의 모양을 변경하면 간단히 해결될 것 같았다.

대상이 되는 audio 엘리먼트에 간단하게 아래와 같이 이벤트를 할당했다.

  audio.addEventListener("play", function () {
    // 재생 모양으로 아이콘 변경
  }, false);

  audio.addEventListener("ended", function () {
    // 대기 모양으로 아이콘 변경
  }, false);



음.. 헌데,..
최초로 버튼을 클릭했을 땐 play 이벤트가 잘 호출되는데,
두 번째 클릭(또는 두 번째 재생)부터는 play 이벤트가 호출되지 않는다.

여러 번 시도에 관계 없이 ended 이벤트는 의도한 대로 작동한다.

뭐가 문제일까?


해결책:
원인은, 오디오가 재생되었으나 명시적으로 '멈춤(paused)' 상태가 되지 않았기 때문이다.

w3c 스펙을 확인해보니, 미디어 엘리먼트(video, audio, ...)의 play 이벤트가 아래와 같이 정의되어 있다.

  play Event

  Fired when... : 
    The element is no longer paused.
    Fired after the play() method has returned,
    or when the autoplay attribute has caused playback to begin.

  Preconditions :
    paused is newly false.

  http://dev.w3.org/html5/spec-author-view/media-elements.html#mediaevents


play() 메서드가 호출되어 paused 상태가 아닐 때에 발생하며,
전제 조건으로 paused 가 새로 false 가 되었을 때이다.


여기서 유심히 보아야 할 것이 미디어 엘리먼트의 paused 속성인데,
현재 재생 상태에 따라 true 또는 false 의 값을 갖는다.
딱 위 문장만 읽었을 땐 굉장히 헷갈렸는데, paused 속성에 대해 이해하니 좀 덜하다. -_-;

paused 속성은 미디어 엘리먼트의 속성으로 접근해 읽어올 수 있지만,
직접 설정은 불가능하다. (audio.paused = true; 는 적용되지 않는다)


paused 속성을 변경하는 두 가지 메서드가 있는데, play() 와 paused()이다.

play() 메서드를 호출하면 미디어 소스가 재생되고,
엘리먼트의 paused 속성을 false로 설정한다. (즉, 더 이상 paused 상태가 아닌 것이다)

하지만 재생이 종료된 후에도, paused 속성을 true로 변경하진 않는다. 



play()와 반대 개념의 pause() 메서드를 호출하면,
재생을 멈추고 paused 속성을 true로 변경한다.

(media play 스펙 참고: http://dev.w3.org/html5/spec-author-view/media-elements.html#dom-media-play)



위 문제에선,
play() 메서드가 호출된 이후에 paused 상태가 변경되지 않았기 때문에(paused = false),
play 이벤트의 'paused is newly false.' 전제 조건에 부합하지 않아서 이벤트가 발생하지 않았던 것이었다.


고로, 재생 후 paused 값을 true로 설정하기 위해,
ended 이벤트에서 명시적으로 paused() 호출해 주는 방법으로 해결했다.

  audio.addEventListener("ended", function () {
    audio.pause();
    // 대기 모양으로 아이콘 변경
  }, false);


 

저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2011.09.08

문제:
진행 중인 미니 프로젝트에서는, 캔버스에 드로잉하고 캔버스를 resize 하는 스펙이 있다.
resize 할 때에는, 그려진 데이터는 (좌측 상단을 기준으로) 고정하고 캔버스만 늘리려고 한다.

jquery를 이용해서 구현하고 있던 터라, 캔버스 엘리먼트를 담고 아래와 같이 크기를 변경했다.

$("canvas").width(w).height(h);

캔버스 크기만 변경되길 기대했는데, 그려진 픽셀까지 함께 확대가 된다.
왜 그럴까?


해결책:
캔버스의 실질적인 크기는 canvas 태그의 속성으로 설정해야 한다.
(속성을 정의하지 않을 경우 기본으로 300, 150 크기를 가진다)

<canvas width="600" height="400"></canvas>

만약 css 속성으로 캔버스 사이즈를 변경할 경우엔,
속성에 기재된 값과 css 속성값의 비율에 따라 스케일이 변경되어 렌더링된다.

위에서 시도했던 것처럼, jquery로 width를 변경할 경우 css 값을 변경하게 되기 때문에 그려진 데이터가 확대된 것이었다.
실제로 캔버스의 사이즈를 변경하고자 하면 아래와 같이 하면 된다.

$("canvas").attr("width", w).attr("height", h);

또는, 아래와 같이 직접 속성을 변경한다.

canvas.width = w;
canvas.height = h;


* 주의:
canvas의 width 나 height을 변경하면, 캔버스 내용이 모두 삭제된다.
기존 데이터를 유지하려면 값을 변경하기 전에 백업해뒀다가 새로 그리는 방법을 이용한다.
- getImageData & putImageData 를 이용한다.
- 캔버스 데이터를 복사한다: http://ohgyun.com/320


* 참고:
- 캔버스 스펙: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#attr-canvas-width




저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2011.08.22

문제:
가벼운 팀 프로젝트로, 웹소켓과 캔버스를 이용해 동시에 그림을 그릴 수 있는 그림판 같은 걸 만들어보고 있다.
중간에 접속한 유저가 기존에 그려진 데이터를 뿅~ 받아볼 수 있는 동기화 기능이 필요했다.

이미 그려진 캔버스를 복사하려면 어떻게 하지?


해결책:
아래와 같은 순서로 처리하면 된다.

1. base64로 인코딩 된 데이터를 가져온다.
2. 이미지 객체를 만들어서, 이미지 문자열을 src에 할당한다.
3. 이미지 로드가 완료되면 로드된 이미지로 캔버스를 그린다.

이미지 로드가 완료되기 전 복사를 시도하면,
빈 이미지로 캔버스를 그리는 것과 같게 되기 때문에 아무 일도 일어나지 않으니 주의한다.


샘플 코드:
// 이미지 데이터를 가져온다.
var imageData = canvas.
toDataURL();

...

// 이미지 데이터를 캔버스에 그린다.
var img = new Image(); // 이미지 객체를 생성하고
img.onload = function () { // 이미지가 로드된 후에
  ...
  ctx.
drawImage(img, 0, 0); // 복사할 캔버스의 컨텍스트를 가져와 drawImage를 호출해 다시 그려준다.
};
img.src = imageData;



참고:
http://stackoverflow.com/questions/6169032/copying-canvas-via-todataurl-after-draw-operation-does-not-work
저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2010.03.11

문제:
얼마 전에 파이어폭스를 업데이트 받았는데, video 태그를 지원한다고 하더군요.
오픈비디오 타입으로 <video> 태그를 구현하면, 플러그인 추가 없이 바로 재생이 가능한 태그라는 설명입니다.

요게 아마 소문으로만 듣던 HTML5 가 아닐까 하는 생각이 들었습니다.
HTML5 에서는 AJAX 도 스크립팅 없이 태그로 바로 구현되지 않을까,
Comet 같은 서버 푸시형 요청이나 스트리밍 통신 같은 것도 지원되지 않을까 하는 생각이 문득 들었습니다.

HTML5 의 정확한 스펙이 뭘까요.


해결책:
스티브잡스가 '어도비 너네 이제 맘에 안들어. 플래시 안 쓸 거야. 대신 HTML5 쓸 거야.' 이런 이후로,
HTML5 에 대한 관심이 더 커졌다고 합니다.

HTML5 에 대한 좋은 포스트가 많네요.^^

HTML5의 모든 것
정말 좋은 자료를 모두 모아둔 포스트입니다. 추천.


HTML5 에 대한 인터뷰 형식의 포스트입니다.
인터뷰 형식이라 더 이해하기 쉽고 쏙쏙 들어오네요.^^
포럼에서처럼 구글 페이지의 소스를 열어보니 정말 HTML5 형식으로 선언되어 있습니다.



아직 국내 포털에는 적용되어 있지 않습니다.
HTML5 최종 표준안이 기대됩니다.


앞으로 개인 작업은 HTML5 로 진행해 봐야겠습니다.
저작자 표시 비영리 변경 금지
Posted by ohgyun
TAG html5