HTML5 Canvasの勉強

HTML5のCanvas要素の勉強のために作成したサンプルが少したまったのでご紹介します。

globalCompositeOperation

Canvasの魅力的な機能のひとつに合成処理があります。図形などを描画するときにglobalCompositeOperationプロパティを設定することで、描画先となるCanvasの内容と合成処理を行い、その結果を描画することができます。

合成とクリッピング(MDN)
globalCompositeOperation プロパティ(HTML5.jp)

ドキュメントを読むだけだと眠くなるので動作確認用のコードを書いてみました。動かす場合は現在大きいウィンドウサイズにしか対応していないので、お手数ですがCodePenに飛んで頂けたらと思います。

See the Pen canvas by senmyou (@senmyou) on CodePen.

lighterやmultiply、screenなど、重なった色を演算して描画するのっておもしろいですね。使いこなせると楽しいかも。

Memo

  • globalCompositeOperationプロパティを指定しない場合はデフォルトとしてsource-overが設定されます。source-overはこれから描画しようとする図形をCanvasの内容の上に描く設定です。
  • 気をつける点としては、globalCompositeOperationプロパティやglobalAlphaプロパティはいったん関数を抜けたりgetContext(“2d”)やbeginPath()を実行しても、値はクリアされずに保持されているということです。つまり「普通に描画するのでglobalCompositeOperationをわざわざ設定することないよね」と思っていても、前に合成処理を行っていればそれが反映されてしまいます。globalCompositeOperationプロパティやglobalAlphaプロパティを設定した場合は、描画後にデフォルトに戻すか、またはsave()/restore()で状態を管理しないとトラブルの元になります。

アニメーション+残像効果

Canvasアニメーションのサンプルです。

  • arc(), fill()でsin/cos式の軌跡を描画
  • requestAnimationFrame()によるブラウザの再描画タイミングに合わせた描画
  • globalAlphaによる透過設定でCanvasを塗り重ねていくことで残像を表現

See the Pen canvas by senmyou (@senmyou) on CodePen.

テキストのネオン効果

ネットでCanvasの使い方を探していたときに素晴らしいサイトを見つけました。

canvas のタイポグラフィ効果(HTML5 Rocks)

魅力的なサンプルに詳しい解説。情報の量、質ともにすごいと思います。そして、ありがたいことにサイトの下の方からソースコードを一式ダウンロードできます。
これをまねてみることにしました。
。。。とはいうものの、やってることが私にとってレベル高過ぎ。ちょっとあきらめかけましたが、根性で無理やり簡略化して動かしました。きっとなにか足りない部分とかあるかもしれませんが、とりあえず、ということで。

See the Pen canvas by senmyou (@senmyou) on CodePen.

これ、CSSでもtext-shadowを使って簡単にできるんですよね。苦労してコーディングしたのにこのままじゃ報われないということで、JavaScriptを活かしたサンプルを無理やり作りました。

See the Pen canvas by senmyou (@senmyou) on CodePen.

。。。ちょっと微妙ですかね。ソースの方はさらに微妙な具合に仕上がってます。

もうひとつ、ジッター効果なるものもまねをさせて頂きました。

See the Pen canvas by senmyou (@senmyou) on CodePen.

。。。うつくしぃ。

一番最後の「残像—ジェネレーティブ効果」も素晴らしい作品でまねてみました。簡略化してなんとか表示できたのですが、これだけは内容がよくわからないため載せるのはあとにしようと思います。

CanvasってAPIの数自体はそんなにないですし使い方もわりと簡単なんですが、ネットやCodePenなどで芸術的な作品を見るたびに驚きと感銘を受けます。さしあたり、CodePenで「canvas」を検索するとたくさんでてきますので、ご覧になってみてはいかがでしょうか。それでは、すてきなキャンバスライフを。

Color Pickerを作ってみました

アプリやゲーム、ブログなどのWebコンテンツを作成するとき、パーツの色を決める作業って意外とたいへんですよね。赤くしたり青くしたり、薄くしたり濃くしたりなど何度も試行錯誤を繰り返し、ふと気が付くと最初に試した色に戻っていたり。
色を探すためのサイトやツールはネットで検索するとたくさん見つかります。どれも十分使えるのですが、そこにちょっと手を加えてより使いやすいものができないかなと思い、色変換などについて勉強しながら自分で作ってみました。

特徴

  • R/G/BとH/S/Lが連動し、各パラメータを自由に設定。
  • 色の保存が可能。試した色を残しておくことで色探しの効率アップ。また、よく使う色や以前に使った色を登録しておくと、いつでもすぐに再現できる。
  • 色を比較しながら探すことができる。
  • CSSファイルから直接コピペで設定できる。

自前のchromeでしか動作確認していないのですが、興味がありましたら使ってみてください。ツールの場所はブログメニューの「倉庫」にあります。

また、パソコンのファイル整理をしていたときに以前勉強のために作ったプログラムがでてきまして、捨てるのはもったいないと思い、これらをちゃんとした形にして「倉庫」に格納しました。

Canvas Artはお気に入りで、ソースの量も小さいのでCodePenにも載せてみました。

See the Pen Canvas Art by senmyou (@senmyou) on CodePen.

ワードプレスに載せて動かすのにはちょっと苦労しましたが、今後もちょこちょこ追加していきたいと思います。

Tiny Noteリリース

シンプルなメモアプリ Tiny Note をリリースしました。

リスト表示でとても見やすい、シンプルなメモ帳

買い物リストや直近の予定など、メモ帳に残すほどでもないようなことを、迷わずさっとメモれるようなシンプルなメモアプリです。

使い捨てのメモ用紙代わりにいかがですか。

巷ではすでに信頼と実績を集めたメモ帳アプリがたくさんリリースされているわけですが、いろいろ使ってみた上で自分なりに使ってみたいメモアプリが頭に浮かび作ってみました。

どのようなメモ帳アプリが使いたかったかというと、

  • 罫線が引かれて、行間が十分あり、見やすいもの
  • 買い物リストややることリストなど、ちょっとしたことに使いたい。なのでバックアップや転送など高度な機能は不要。単純にメモるだけのもの。
  • タイトルとかいらないし、新規作成もいらない。手間をかけたくない。
  • ちょっとスタイリッシュな感じのもの。
  • 先頭だけではなくメモ領域のどこからでも書き始められるもの。

といった、とても個人的なものです。

シンプルすぎる内容ですが、実際コーディングしてみると予想以上に大変でした。
ちょっとアプリの作りについて裏話的に書いてみます。

  • Android4.4.2以下に対応させるためにCrossWalkプラグインを導入(※)。おかげで動作の安定感が2倍以上増しました(自分比)し、最新のWebViewでAPIが使える(window.screen、navigator.language)などいいことがいっぱいですが、アプリのサイズも2倍以上増えてしまいました。低機能・軽量を目指していたのですが断念。Android4.4.2以下を切れば済む話ですが私のスマホがAndroid4.4.2なのでやむなし。
  • メモ領域はtextarea要素ではなくdiv要素&contenteditable属性で作成。罫線を引くため。これがけっこう曲者でいまだ謎の部分あり。なにやらfont-sizeとline-heightの差が大きいとメモ領域の最終段で改行したときに発生するスクロールの量が一行分でなくなる。改行を開始した行までスクロールされる感じ。そうゆう仕様ということにしました。
  • 買い物リストややることリストなどを想定しているため、今回はファイルではなくローカルストレージに保存。
  • フォントサイズは各シートで共通。シートごとに持たせることはできるけど必要ないかなと。また、シートごとに色を選択できるようにすることも考えましたが、とりあえず保留(めんどそう)。
  • 端末の回転について以前記事を書いたのですが、CrossWalkプラグインを入れたら挙動が変わりました。ちょっと焦りましたが、window.screenが使えるようになったため端末の縦横判定時にキーボードの表示・非表示を気にせず「screen.width < screen.height」とするだけで良くなりました。ちょっとむなしかったです。
  • アプリの起動を少しでも速く、アプリのサイズを少しでも小さくしたくて、スプラッシュスクリーンを使わないようにしてみたのですが、どうしてもうまい具合になりませんでした。パターン1:起動—>真っ黒—>真っ白—>アプリ画面表示、パターン2:起動—>真っ黒—>真っ白—>真っ黒—>画面表示。真っ白いらないのに。スプラッシュスクリーン必須という結論に。

※ Onsen UI V2はAndroid4.4.4以上をサポート。4.4.2以下はCrossWalkプラグインが必要

なにはともあれ、無事リリースまで辿り着きました。

本日よりGoogle playストアで公開中ですので、よろしければご利用ください。

Google Play で手に入れよう