html5-developers-jp の ハンズオンセミナーに行ってきました
html5-developers-jp主催のハンズオンセミナーに行ってきました. 内容はcanvas要素のイントロダクションです. とても丁寧に説明していただいたので, ちょっとでもjsを書いたことがある人なら誰でも理解できると思います.
羽田野さん
canvasのsetTransformメソッドについての解説です. setTransformは画像に移動・スケーリング・傾斜の変換をかけることができます.
題材はこちらのanimation demoです.
html
<input type="range" name="fps" id="fps" min="1" max="120" step="1" value="60" /> <output for="fps" onformchange="value = form.elements.fps.value">output> fps
onformchange イベントハンドラ. フォームの値が変わると呼ばれる. html5仕様.
output要素. jsで値を入れることを想定した要素. html5仕様.
<p><canvas id="canvas" width="300" height="300">canvas>p>
js
初期化処理
var img = new Image(); img.src = "futomi.jpg"; // ... window.addEventListener("load", function() { // contextを取得 ctx = document.getElementById("canvas").getContext('2d'); // imgを座標(0, 0)に描画 ctx.drawImage(img, 0, 0); btn = document.getElementById("btn"); btn.addEventListener("click", toggle, false); // width, height, centerを取得 cw = parseInt(canvas.width); ch = parseInt(canvas.height); cc = cw / 2; }, false);
ボタンを押してムービーをスタート・ストップ
function toggle() { if( moving == true ) { moving = false; btn.value = "start"; } else { moving = true; move(); btn.value = "stop"; } }
ムービー
function move() { // transform を初期化 ctx.setTransform(1, 0, 0, 1, 0, 0); // canvasの画像をクリア. cw*3, ch*3 は transform によってはみでた部分を消している // クリアすると透明な黒色になる. background-colorが透過して表示される. ctx.clearRect(-cw, -ch, cw*3, ch*3); // 回転角, 画像の横位置を計算 var m11 = Math.cos( deg * Math.PI / 180 ); var dx = ( cw / 2 ) - ( cw * m11 / 2 ); // transform して描画 ctx.setTransform(m11, 0, 0, 1, dx, 0); ctx.drawImage(img, 0, 0); // 角度を更新 deg ++; deg = deg % 360; // setTimeoutでfpsに応じて自分を呼び出し var fps = get_value("fps"); fps = parseInt(fps); if( fps <= 0 ) { fps = 1; } if( moving == true ) { setTimeout( move, parseInt( 1000 / fps ) ); } }
その他の変形メソッド
- rotate()
- 回転
- scale()
- 拡大縮小
- setTransform()
- アフィン変換
- translate()
- 平行移動
- transform()
- 変換行列で変換
白石さん
画像がフェードイン・アウトするサンプルです. 題材はこちら
html
<html lang=ja> <head> <meta charset=UTF-8> <meta http-equiv=X-UA-Compatible content="chrome=1"> <title>フェード効果のサンプルtitle> head> <body onload="init()"> <h1>フェードアニメーションのサンプルh1> <canvas id=canvas width=300 height=300>canvas><br> <button onclick="fadeIn()">フェードインbutton> <label for=alphaBar>透明度:label> <input id=alphaBar type=range step=0.1 value=1 max=1 min=0 onchange="changeAlpha()"> <button onclick="fadeOut()">フェードアウトbutton>
ダブルクオーテーションの省略などhtml5ナイズされています.