2014年1月11日土曜日

[Android] SurfaceViewのアナログ時計アプリを作ってみました

The analog clock application on SurfaceView
前々回 前回 のアナログ時計のアプリをSurfaceViewで表示するように作り直してみました。
OpenGLよりSurfaceViewのほうがずっと簡単です。

今回の開発環境は次の通りです。
・64bit版 Windows8
・32bit版 Eclipse3.7 (Windows XPモードで使用)
・Android-SDK r22.3

針の画像です。
左から秒針、分針、時針のつもりです。
針の画像それぞれのピクセル数は32×128です。一番右の黒い塗りつぶしの領域は使用しません。

Eclipseのパッケージ・エクスプローラーで、プロジェクトの res フォルダーの下に
drawable-nodpi
というフォルダーを作り針の画像を配置します。

以下ソースです。

アクティビティ(MainActivity.java)

MyHandlerクラスでループ処理の頻度を制御しています。
設定次第でループ処理を減らせるのでOpenGLで作った場合にに比べるとバッテリーの持ちをよくする効果が期待できます。
MyHandlerクラスのINTERVALという定数の数値を大きくすればループ処理を減らせます。
ただし、INTERVALの数値を大きくしすぎると針が指す時刻と実際の時刻の誤差が大きくなります。

320×480ピクセルのエミュレーターで実行するとこんな感じになります。

OpenGLのアプリは画像の大きさを画面サイズに対して相対的に指定できましたが、SurfaceViewは絶対値で指定する必要があります。
1024×640の画面で実行すると下のようになります。
各針の画像の絶対的な大きさは変わらないのですが、画面が広くなった分小さく見えてしまいます。
解像度ごとに大きさを合せた針の画像を用意するか、Canvasクラスのscaleメソッドで画面サイズに合わせて拡大するといいかもしれません。

関連ブログ
[Android] アナログ時計のアプリを作ってみました
[Android] アナログ時計のアプリをC/C++で改良
[Android] ストップウォッチアプリを作ってみました
[Android] ストップウォッチアプリの表示をC言語でスムーズに改造する
[Android] 方位センサーを使ってコンパスアプリを作る
[Android] Javaのstaticクラスから非sataticメソッドを呼び出すには
[Android] OpenGLの簡易画像ビュアーにSDカード内の画像を表示する
[Windows8][Android] EclipseをXP互換モードで起動する理由(Can't bind to local 8600 for debugger)
[Android] Android-SDKでやってはいけないこと
[Android] Toastに画像やボタンを表示するには
[Android] ライブ壁紙の作り方
[Android] Activityに時計を表示する(Activityの非同期更新)
[Android] Webコンテンツを強制的に表示するには
[Android] Toastをcancelするには

以上、参考になれば幸いです。

0 件のコメント:

コメントを投稿