ステップ4:お絵かき処理

=前置き=

 必要なパーツの設定方法は前回のステップでだいたいできた。今回からはもう少しドット絵エディタ特有の設定をしていく。


 今回のステップは例の本はあまり使わなかったけど、「キャンバスはボタンを並べたやつを使った方が良いのかな」とか考えた際に「数独で試したけどめんどいよ」という記述があったのを思い出すなどして役に立つ部分もあった。

=お絵かき処理=

 まずは普通のドット絵エディタとして「お絵かき処理」が欲しい。つまり、タッチした位置に色を塗るようにしたい。しかし、たったそれだけのことでも真面目にやると複雑なので、いくつかのステップに分けて考える。
 まず、「表示とデータは違う」と考える。データの1ピクセルを普通にそのまま表示すると、かなり小さくなってしまう。見にくいのもさることながら、狙ったピクセルをタッチで更新するのに無理がある。そのため、表示はデータを何倍かしたものを使う。
 ということで、「データはどう持てば良いか」「拡大表示はどうすれば良いか」「タッチ処理はどうすれば良いか」に分けて考える。

=データ=

 AndroidのデータはBitmapで持つことにする。これはAS3のBitmapDataとほぼ同じ感じ。なので特に書くことがない。

 生成方法については以下のページの中盤あたりが参考になった。

 グラフィックス(6)-Bitmapの描画とMatrixの操作 - 愚鈍人

=拡大表示=

 普通の表示方法は先ほどのページに書いてあるものの、今回必要なものは拡大表示での表示方法。これは特に難しくなく、上のページで使われてる関数drawBitmapを(Canvasなどの単語と一緒に)ググったらリファレンスが出てきたので、それを参考にする。

 Canvas  |  Android Developers

 drawBitmapは単純な位置指定の他にMatrix指定のものがあった。これなら拡大表示ができるし、将来的に必要そうな「表示位置をズラす処理」にも対応できそう。ということで、これを使うことにする。


 ただ、完全に自分用と割り切れば別だけど、「どの程度拡大すれば良いか」というのは端末ごとに異なるのが困る。タッチで操作できる最小単位は1cm×1cmくらいっぽいけど、Bitmapを普通に10倍とかすると表示は「10ピクセル」になって端末ごとに長さが変化してしまう。AndroidではGUIの長さを"dip"という「長さ」で設定する方法があるので、それをコードでも使いたい。ということで以下のページが参考になった。

 http://handalab.com/android/dev-2/device/149/

 これを使えば「データの1ピクセルが1dipになるように拡大する」という処理が可能になる。単位が独特なのが難点だけど。

=タッチ処理=

 あとはタッチした位置にあるピクセルを変更し、Bitmapを表示すれば良い。

 タッチイベント自体は単純にonTouchEventをオーバライドするだけなので、以下あたりを参考にする。

 http://www.adakoda.com/android/000123.html

 将来的にはちゃんとラインとか引けた方が良いかもしれないが、それは他のツールと一緒にやることにして、ここでは単にピクセルを塗りつぶすことにする。
 ただし、ここで得られるタッチ座標は「表示上での座標」なので、これを「データ上の座標」にするため、上で使った倍率で割った値を使う必要がある。

 あと、表示データを更新する場合はinvalidateを呼ばないといけないらしいので、更新があった場合はこれを呼ぶことにすればOK。

=予定=

 ここまでは「普通のドット絵エディタ」で必要な処理だった。次からはだんだんと「独自HLS計算」などの「自分用ドットエディタ」で必要な処理に入っていく。