2009/08/29

Androidアプリ: 「東京アメッシュ」もズーム対応しました

「東京アメッシュ」アプリにもズーム機能を追加しました。
全域を見渡すことができるようになったので、雨が上がるタイミングを狙いやすくなったんじゃないかと思います。

2009/08/15

Androidアプリ: 「日本のお天気レーダー」シーク動作を高速化

新たに画像の先読み・キャッシュ機能に対応して、シーク動作を高速化しました。
アプリを起動すると、まず最新画像を読み込んで表示します。その後、バックグラウンドで過去3時間分の画像を先読みします。

先読み中にシークした場合は、その時刻の画像のダウンロード・表示が優先されます。非同期処理の実装にはAsyncTaskを使っているのですが、先読みを小分けにすることで、UI操作に素早く反応できるようになっています。

JPEGファイルがメモリにキャッシュされると、それ以降ネットワークにアクセスしなくなるので、以前と比べて高速にシークできるようになりました。ただ、JPEGのデコードにそれなりに時間がかかるので、思ったほど劇的には高速化しませんでした。残念。

デコード後のBitmapをキャッシュする方法も試してみたのですが、さすがにメモリが足らずに安定して動作しないので断念。

これで、Android Marketのユーザーコメント欄にあったリクエストには対応したつもり。

2009/08/08

Androidアプリ: 「日本のお天気レーダー」にズーム機能を追加しました

Androidアプリ「日本のお天気レーダー」にズーム機能を追加しました。
「ズーム機能が付いてたらいいのに」というコメントがいくつかあったので、実装してみました。画面にタッチした後の1秒間だけ、ズームボタンが表示されます。また、画像のスクロール位置や、ズームの設定が、アプリ終了時に保存されるようになりました。

Androidのブラウザや地図アプリで使われているのと同じUIを実装してみようと調べてみると、ZoomControlsを使えばいいことが分かりました。
LayoutファイルにZoomControlsを追加して、ズームボタンを押された時のListenerを設定すればOK。例えばこんな感じ。

mZoomControls = (ZoomControls) findViewById(R.id.zoom_controls);
mZoomControls.setOnZoomInClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
zoomIn();
}
});
mZoomControls.setOnZoomOutClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
zoomOut();
}
});

ちょっと手間取ったのは、画像の拡大・縮小の実装でした。調べてみると、ImageView.setImageMatrix()を使えばいいことは分かったのですが、いまいち使い方が分からない。
ドキュメントには実際の使い方がわかるような記述がないし、ネットで調べてみても参考になりそうなコードはなかなか見つからない。結局、Androidのカメラアプリのソースを見てみることに。
postScale()とpostTranslate()を組み合わせて、何とか動くようになったものの、カメラアプリの洗練された実装と比べると、何かいまいちな感じ。Matrixの使い方はもうちょっと勉強する必要がありそう。落ち着いたら、他のお天気アプリにもズーム機能を実装してみよう。

あと、画像の拡大・縮小率もちょっと工夫しました。はじめ、何も考えずに一定間隔のスケールで拡大・縮小させてみたのですが、元画像に細かい模様が含まれているので、中途半端なスケールで拡大・縮小すると、モアレが生じてしまって画質が悪くなってしまいました。そこで、[50%, 75%, 100%, 125%, 150%, 200%, 300%]のステップで変化させるようにしてみました。

次は端末を回転したときに、いちいち画像を再ダウンロードしないようにして高速化してみようかな。
アプリを公開してから約1ヶ月でダウンロード数が5000を越えました。今、日本でAndroid携帯はどれぐらい売れているんでしょうかね。