2011年5月17日火曜日

Android 数字画像を使って簡単なデジタル時計を作る。

数字画像を用意してデジタル時計を作ってみる。
今回作成した物は、数字画像を使って、時刻の表示のみ、余計な設定は入れていない。

拡張子がpngの画像(数字)が9枚、それから、コロン画像1枚の計10枚。

画像を読み込むための準備
まず、変数で、配列の初期化を行う。
private Bitmap digits[]=new Bitmap[11];

これを使って、コンストラクタの中で画像を読み込む。
Resources r=context.getResources();
dgits[0]=BitmapFactory.decodeResource(r,R.drawable.a0);
dgits[1]=BitmapFactory.decodeResource(r,R.drawable.a1);
dgits[2]=BitmapFactory.decodeResource(r,R.drawable.a2);
dgits[3]=BitmapFactory.decodeResource(r,R.drawable.a3);
dgits[4]=BitmapFactory.decodeResource(r,R.drawable.a4);
dgits[5]=BitmapFactory.decodeResource(r,R.drawable.a5);
dgits[6]=BitmapFactory.decodeResource(r,R.drawable.a6);
dgits[7]=BitmapFactory.decodeResource(r,R.drawable.a7);
dgits[8]=BitmapFactory.decodeResource(r,R.drawable.a8);
dgits[9]=BitmapFactory.decodeResource(r,R.drawable.a9);

コロン画像も読み込む
dgits[10]=BitmapFactory.decodeResource(r,R.drawable.c);

画像の読み込みは終了。

次に、時刻の設定について
Javaで時刻を使うには、Calendarクラスを使って設定を行う。
このCalendarクラスは、デフォルトのタイムゾーンに基づいて
設定されている。

Calendarクラスは、abstractクラスなので、new演算子でオブジェクトを作成することが出来ないので、
次の設定を行って、オブジェクトを作成する。
Calendar calendar=Calendar.getInstance();

これで、Calendarクラスが使えるようになる。
ちなみに、import文は、
import java.util.Calendar;

今回は、変数を設定して使ってみる。
private Calendar currentTime;

そして、描画を設定しているメソッドで時刻の設定情報を呼び出して設定する。
こんな感じ
//時間
canvas.drawBitmap(dgits[currentTime.get(Calendar.HOUR_OF_DAY)/10],1*imageWidth,0,null);
canvas.drawBitmap(dgits[currentTime.get(Calendar.HOUR_OF_DAY)%10],2*imageWidth,0,null);
canvas.drawBitmap(dgits[10],3*imageWidth,0,null);

//分
canvas.drawBitmap(dgits[currentTime.get(Calendar.MINUTE)/10],4*imageWidth,0,null);
canvas.drawBitmap(dgits[currentTime.get(Calendar.MINUTE)%10],5*imageWidth,0,null);
canvas.drawBitmap(dgits[10],6*imageWidth,0,null);

//秒
canvas.drawBitmap(dgits[currentTime.get(Calendar.SECOND)/10],7*imageWidth,0,null);
canvas.drawBitmap(dgits[currentTime.get(Calendar.SECOND)%10],8*imageWidth,0,null);
canvas.drawBitmap(dgits[10],9*imageWidth,0,null);

//ミリ秒
canvas.drawBitmap(dgits[currentTime.get(Calendar.MILLISECOND)/100],10*imageWidth,0,null);
canvas.drawBitmap(dgits[currentTime.get(Calendar.MILLISECOND)%10],11*imageWidth,0,null);
canvas.drawBitmap(dgits[currentTime.get(Calendar.MILLISECOND)%1],12*imageWidth,0,null);

時分秒ミリ秒などを取得する為のものがCalendarクラスのget()メソッドを使って、その引数の中に
Calendarクラスの各フィールドを呼び出して使用する。

※imageWidthについて・・・
この変数には、画像の幅を取得した値が代入されている。
Androidの画像の幅を取得するには、BitmapクラスのgetWidth()メソッドを使用して取得。

今回、SurfaceViewを使用して作っているので、run()メソッドの中でも設定を入れてあげないと
動作しない。
あと、コンストラクタの中にも、currentTime=Calendar.getInstance();
を設定をする。

run()メソッドの中身はこんな感じ
/**
 * スレッドの処理
 */
public void run() {

Canvas canvas;

while(thread!=null) {

//動作させる為にCalendarクラスのgetInstance()メソッドを
//呼び出している。
currentTime=Calendar.getInstance();

//ダブルバッファリングのロック処理
canvas=holder.lockCanvas();

//背景処理
canvas.drawColor(Color.BLACK);

//描画設定のメソッドの呼び出し
draw(canvas);

//ダブルバッファリングのアンロック処理
holder.unlockCanvasAndPost(canvas);

try {
Thread.sleep(30);

}catch(InterruptedException e) {
e.printStackTrace();

}

}
}

これで完成。
完成動画



Java Calendarクラス
Android reference Calendarクラス

その他、数字画像を使用したもの関連
Androidでゲーム ブロック崩し編   9回目:数字画像を使って点数の表示
Androidでゲーム ブロック崩し編 12回目:数字画像を使って機数の表示と設定

2 件のコメント:

  1. こんにちは
    現在Androidの勉強をしています。

    まだまだ初心者で、
    画像を使ったデジタル時計を作ろうと思っています。
    自分でもソースを書いているのですが、
    参考になるページが少なく資料を探しています。

    もし宜しければ
    ソースを見させてはいただけないでしょうか?

    よろしくお願いいたします。

    返信削除
  2. メールはtea.lile.tea<>gmail.comになります。

    返信削除