ぱすたけ日記

日記っぽいのを書きます。

お絵かき体験向上作戦 #kyotojs

プレゼンモード
再生
← / →で移動
fでフルスクリーン
escでおわる


お絵かき体験向上作戦

id:Pasta-K at Kyoto.js 11

こんにちは

  • 京都の大学生です。
  • Notaって会社でGyazoってサービスの開発のアルバイトをしています
  • 趣味としてBrowser Extensionについての観察を行っています
  • ステッカーあります


振り返り

この発表は京都.なんか #2で発表したReactとCanvasでお絵かき機能を作った話の続編です。

今北産業

  • Gyazoの画像編集機能はReactとcanvasを組み合わせて作っている
  • ReactとCanvas組み合わせ事例
  • canvasにはcanvas、DOMにはDOM、ReactComponentにはReactComponentの状態があり、それぞれのライフサイクルがある
  • 個々の図形のマウスイベントハンドリングを上手くやっていく
  • 良い感じに頑張っていく必要がある

前回の教訓より

  • React成分を取り払ったところ、ただ単なるcanvasの入門的な紹介になった
    • 各自の想像でReact成分を補足してください

今回のお話

  • 前回でReactとCanvasを組み合わせて良い感じにお絵かきを実装する大変ポイントと回避方法がわかった(ということになっています)ので、おもてなし感を高める。
    • 前回よりは基本的なcanvasに関する知識やテクニックの紹介です
  • 拡大縮小機能でcanvasリサイズ問題
    • 前回予告にあった『HiDPI対応』はこれの応用でできます。
  • textareaとcanvas同期問題

拡大縮小


canvasリサイズ問題

  • 編集中にcanvasサイズを拡大したい
    • Gyazoの場合だと、下に敷いてる画像サイズを実寸サイズにして、canvasもそれに追随させたい。またはそれの逆など

canvasリサイズ基礎知識

どういうリサイズを行うのか

canvasリサイズ時の意図

  • キャンバスサイズを大きくしたい
    • 先程のデモのようにプロパティを大きくしてやればOK
  • 画像自体を拡大したい
    • 拡大比率に合わせて、座標位置、フォントサイズ、線の太さなども同じ比率で大きくする

描いてる最中で拡大縮小したい

  • ということがよくあるので、初回生成時のcanvasサイズを覚えておいて、描画時にその覚えておいたcanvasサイズと現在のcanvasサイズの比から適切な倍率で描画すると良い感じになります。
    • 各図形ごとにプロパティとして保持しておいて、レンダリング時に各々の適切な倍率を計算する

textareaとcanvas同期問題

  • canvasだと色々文字装飾ができる
    • 縁取りも容易
  • 上にtextareaを重ねる形式だと楽だけど、見た目を同じに表現できないので、逐次canvas上に描画してリアルタイムに見た目を確認できるようにしたい

はい

  • textareaとcanvasで文字を同期させる
  • IME表示とカーソル
  • (おまけ)Emoji😜 on canvas

textareaとcanvasで文字を同期させる

  • 普通にやっていけばOKです
    • onInputで文字列を取ってcanvasに書く
    • onKeydownでカーソル移動などを取得する
  • textareaとReactについては省略しますので、各自でトライしてください

IME表示とカーソル

IME表示制御

  • font-sizeとline-heightをtextareaとcanvasContextで揃えておく
  • textareaを良い感じの位置で重ねて、opacity:0 とかにするとすんなりうまくいきます

カーソル表示

  • opacity:0にするとカーソルが視えないので、divタグとかで良い感じにカーソルモドキを表示する
  • カーソル位置を取得する
    • カーソル位置を取得する
    • 端から文字を数えていって、何行目の何文字目かを確定させる
    • その場所にカーソル風の何かを表示する

(下のコードは雰囲気で書いてるので、動くことを保証していません)

const textarea = document.querySelector('...')
const currentCaretPosition = input.selectionStart
let textCounter = 0
textarea.value.split('\n').forEach((lineText, lineIndex) => {
  if (textCounter + lineText.length < currentCaretPosition) {
    // 行内にカーソルがないなら文字数をカウントしておいて次の行へ
    textCounter += lineText.length
  } else {
    const canvas = document.createElement('canvas')
    const context = canvas.getContext('2d')
    context.font = `bold ${fontSize}px Arial,Sans-Serif`
    // 行冒頭からカーソルまでのテキストを取り出す
    const text = lineText.substr(currentCaretPosition - textCounter)
    // 文字の縁取り線などを考慮して横幅を確実に取得するために
    // CanvasRenderingContext2D.measureText()を利用する
    const cursorX = context.measureText(text).width
    const cursorY = lineHeight * lineIndex
  }
})

範囲選択を表現

  • 応用したら出来るので、皆さんへの宿題にします

(おまけ)Emoji😜 on canvas

まとめ

  • 本日はReactのことを一旦忘れてcanvasで文字入力や拡大縮小に関する機能を実装することについて紹介しました。
    • Reactの話を挟まないとシンプルで良いですね
    • ちなみにここにReactが登場すると
      • textareaとReactとcanvas状態対決
        • IME変換中にcanvasには描き込むが、図形情報(state)は更新しない
      • 倍率計算のためのcanvasサイズをそれぞれの図形に伝えるためのpropsバケツリレー大会またはcontextチャレンジ
      • などが勃発しますので盛り上がります
  • 皆さんも便利なお絵かきツールを書いて、体験を高めていきましょう

MBPのメモリを16GBにした

これまでは4GBでも対して困りがなかったのだけど、Sierraにしてから何故かメモリが食い尽くされることが増えて、何もできない時間が増えたから思い切って16GBに上げた。

シリコンパワー ノートPC用メモリ  DDR3 1600 PC3-12800 SO-DIMM 8GB×2枚 永久保証 SP016GBSTU160N22

シリコンパワー ノートPC用メモリ DDR3 1600 PC3-12800 SO-DIMM 8GB×2枚 永久保証 SP016GBSTU160N22

選んだメモリはこれ。MBP Mid 2012で実際に動いたと言ってる人が居たので購入した。あと、ちょうどたまたま1600円くらい安くなるタイムセールしててラッキー。

以下が結果です。

2016年9月に読んだマンガ & 2016年10月に読みたいマンガ

こんにちは。皆さん、夏はマンガをいっぱい読みましたか?秋もいっぱいマンガを読みましょう。

昨年分

先月分

2016年9月に読んだマンガ

星野、目をつぶって。 3巻

サイハテドライブ 1巻

魔法少女サイト 6巻

うちのクラスの女子がヤバい 2巻

ヒナまつり 11巻

推しが武道館いってくれたら死ぬ 2巻

累 9巻

君に届け 27巻

俺物語!! 13巻

亜人ちゃんは語りたい 4巻

アニメ化おめでとう!!!!!

今巻は今までよりも圧倒的に良かった。特に最後、亜人ちゃんたちと普通の生徒たちとがお互いに向かい合おうとして近づき始まる回があって本当に良かった。それだけでも読んでくれ!!!!!

3月のライオン 12巻

バツコイ 2巻

サイケまたしても 6巻

娘の家出 5巻

バッドビート!~辻堂真夏のポーカー戦線~ 1巻

猫のお寺の知恩さん 1巻

ふつつかなヨメですが! 3巻

目玉焼きの黄身 いつつぶす? 7巻

私の少年 1巻

恋は光 5巻

紅井さんは今日も詰んでる。 1巻

くまみこ 7巻

つぐもも 18巻

これもアニメ化決まりましたね。お色気枠になるのかなぁ。出来ればアクションシーンをカッコよく描いて欲しい。

魔法使いの嫁 6巻

寄宿学校のジュリエット 3巻

放課後カタストロフィ 3巻

ちおちゃんの通学路 5巻

それでも僕らはヤってない 5巻

あそびあそばせ 2巻

きみとユリイカ 3巻

あの娘にキスと白百合を 5巻

2016年10月に読みたいマンガ

最果てにサーカス 3 (ビッグコミックススペシャル)

最果てにサーカス 3 (ビッグコミックススペシャル)

灼熱カバディ(3) (裏少年サンデーコミックス)

灼熱カバディ(3) (裏少年サンデーコミックス)

片翼シャトル 1 (ゲッサン少年サンデーコミックス)

片翼シャトル 1 (ゲッサン少年サンデーコミックス)

骨が腐るまで(1) (マンガボックスコミックス)

骨が腐るまで(1) (マンガボックスコミックス)

AIの遺電子 3 (少年チャンピオン・コミックス)

AIの遺電子 3 (少年チャンピオン・コミックス)

まめコーデ(1)【電子限定特典ペーパー付き】 (RYU COMICS)

まめコーデ(1)【電子限定特典ペーパー付き】 (RYU COMICS)

茜色のキスは屋上で (百合姫コミックス)

茜色のキスは屋上で (百合姫コミックス)

アニメタ!(3) (モーニングコミックス)

アニメタ!(3) (モーニングコミックス)

絢爛たるグランドセーヌ 7 (チャンピオンREDコミックス)

絢爛たるグランドセーヌ 7 (チャンピオンREDコミックス)

三ツ星カラーズ3 (電撃コミックスNEXT)

三ツ星カラーズ3 (電撃コミックスNEXT)

天野めぐみはスキだらけ! 4 (少年サンデーコミックス)

天野めぐみはスキだらけ! 4 (少年サンデーコミックス)

あげくの果てのカノン 2 (ビッグコミックス)

あげくの果てのカノン 2 (ビッグコミックス)

睡眠 夢 叫ぶ

1年前にもTwitterに書いてた

ここ最近、夢の中で声を荒げたら実際に叫んでいてびっくりして目覚める。そして、弟も母も起きてくるということがこの1ヶ月の間に3回くらいあった。

インターネットで検索すると、ストレスとか鬱病とか出てきて不穏で心配。

snapchat開始した

知人に薦められてsnapchat開始した。snapchatは写真とか動画を撮ってそれをグループなり友人全体なりに共有できるサービス。

Instagramとかと違うのは最大10秒までしか表示できなくて、それも2回表示すると表示できなくなるというのがあるので、気楽に写真とか動画を厳選せずに共有できるのが良いポイントらしい。

あとフィルターとかスタンプがデカくてかわいい。

是非友だちになりましょう。

共有した写真はシュッと消えるのだけど、スクショを撮られると永続化されるので気をつけましょう。

UIはボタンが少なくてシンプルなのだけど、チュートリアルを飛ばしたので、どうやれば表示時間を変えられるのかとかまだ分かってない。あと上の自分のidを共有する画面出すのも分からなくて教えてもらった。とはいえ楽しいので、皆さんもやりましょう。

さんきゅーです。