ステップ5−2:プレビュー〜セーブ&ロード

=前置き=

 普通のお絵かき処理のセーブ&ロードのところまでのログ。というかTips集に近くなってきた。ここまでくると初心者本ではもう参考にならない範囲。

 今週はわりと忙しいのであまり趣味の作業はできなさそう。なので金曜の更新もなし。GWの月〜金は出勤することになったけど、そちらはもう少し余裕があるはず。

=Matrix=

 AndroidのMatrixは「Set」が新規作成に相当、「Post」が後からかける処理に相当。Setの方は部分的な上書きだと勘違いしたけど、そうじゃなかった。

=時刻をファイル名にする=

 「データごとにファイルを分けたい」「0.zip、1.zip、…という連番だと管理にカウンターが必要」など色々と考えた結果、時刻(20110422102500)をファイル名にすればソートもできるしUniqueなIDになるので、時刻をファイル名にすることにした。

 Java日付処理メモ(Hishidama's Java Date Memo)のDateFormatの項目を参考に、Oracle Technology Network for Java Developers | Oracle Technology Network | Oracleの書式に従って時刻を文字列化してファイル名として使った。

=Zipによるセーブ&ロード=

 描いたものはBitmapとして、パレットはHashMapとして、Zipにひとまとめにしてセーブ&ロードすることにした。
 セーブとロードの両方を見やすい形式で書いてあるところが見当たらなかったけど、セーブならhttp://techbooster.jpn.org/application/3602/、ロードなら» ZipFile と ZipEntry ~Androidでzipを解凍する Android はじめました。あたりが参考になった。後者はやや18禁気味なので会社だと参照しづらいけど、Bitmapのロードの参考にもなる。

=Bitmapのセーブ&ロード=

 BitmapをZipに入れるには、byteに変換する必要がある。逆にZipから取り出す際はbyteからの変換が必要。
 これはhttp://www.saturn.dti.ne.jp/~npaka/android/SnapShotEx/index.htmlが参考になった。ただ、byte[]に変換する際の指定がわかりにくいので、そこはY.A.M の 雑記帳: Android Bitmap Tips - jpg, png 作成とか -を参考にした。
 おそらくピクセルだけでなく他の情報も入ってしまっているが、代わりに普通の画像になっているはずなので、Zipを普通に解凍すれば普通に画像の確認ができるはず。ただし、合成結果の画像以外は意味不明な画像になっていると思う。

=HashMapのセーブ&ロード=

 HashMapもZipに入れるにはbyteとの相互変換が必要になる。
 幸い、カラーパレットなので項目はHLSAの4つで固定だし、色の数も今は8個で固定で増減は難しいので、決め打ちでbyte
化できる。
 Floatとbyte[]の相互変換はあまり情報が見つからず、byte[] を long,float とかに変換したい 【OKWAVE】あたりを参考になんとなく作ったらできた。http://www.javadb.jp/Code.sd?id=8あたりも参考になるかもしれない。

=ロード画面のポップアップ=

 ロード画面はダイアログのようにポップアップしつつ、画面の8割を占める感じにしたかった。普通のダイアログだと幅が小さくなってしまうので、http://team-hiroq.com/blog/android/transparentactivity.htmlを参考にして背景を半透明で暗くしたりPaddingで余白を確保して実現。

=ロード時のプレビュー対応=

 ロード画面は「各ファイルのプレビュー」「選択したファイルの拡大表示」「決定ボタン」の3つで構成することにした。この構図はほとんどhttp://androside.com/page_contents/page_android_imageGallery.htmlと同じなので、これを参考にして作成。

=Activity同士の値の受け渡し=

 ロード画面は別のActivityで作ることにしたので、通常のActivityとの値の受け渡しが必要になる。これはhttp://www.saturn.dti.ne.jp/~npaka/android/CalledActivityEx/index.htmlを参考にして作った。

=別スレッドでの処理の実行=

 画像の遅延ロードをスレッドを生成する - Androidプログラマへの道 〜 Moonlight 明日香 〜を参考に対応。スレッドを作って関数を呼ぶだけなので簡単だった。

=xmlで指定した長さをJava側で取得=

 プレビューなどでBitmapを作成する際に、レイアウトの幅が欲しい場合がある。普通にgetWidth()などでも良いけど、xmlでの定数を使いたかったのでY.A.M の 雑記帳: Android Dimension 単位を参考に取得。

=画像を元のサイズのままロード=

 「マップの絵を描く」ということで、基本的な輪郭の傾き(法線マップ)は最初から設定しておきたい。そこでその画像を作ってロードしたものの、勝手に拡大されてしまい、こちらの用意したサイズと合わない。これはGoogle グループを参考にして対応した。具体的には「drawable-nodpi」というフォルダに入れることでDPI依存で変化するのを防ぎ、さらに「new Options(){{inScaled = false;}}」を指定することでスケーリングをさせないようにした。片方だけだとダメっぽい。