スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SurfaceViewの使い方2:定期的な描画

はじめに


前回の記事では、SurfaceViewをとりあえず使ってみる、というところまでやりました。ただし、SurfaceViewの本領を発揮するためには、やはり定期的に再描画を行わせないといけないと思います。今回は、SurfaceView+定期的な描画、というプログラムを作成してみます。


いろいろなサイトをめぐってみると、SurfaceViewと描画の組み合わせで良く用いられているのは、「Runnableインターフェース」と、「Threadクラス」のようです。


今回も、@IT「SurfaceViewならAndroidで高速描画ゲームが作れる」にあるサンプルコードを参考にしたいと思います。参考にするコードは「GameSampleWithSurfaceView.java」です。


プロジェクトの新規作成


いつものようにEclipseを起動して、新規プロジェクトを作成します。「ファイル」→「新規」→「Androidプロジェクト」を選択して、「新規Androidプロジェクト」ウィンドウを表示させます。そして以下を設定します。



  • プロジェクト名:SampleSurViewCycle

  • ビルド・ターゲット:Android 1.6

  • アプリケーション名:Sample Surface View Cycle

  • パッケージ名:jp.sample.SampleSurViewCycle

  • Create Activity:SampleSurViewCycle


リソースレイアウトの修正


今回もリソースレイアウトmain.xmlファイルは使用しないため、修正は無しです。


ソースコードの修正


ソースコードSampleSurViewCycle.javaファイルを修正していきます。基本的には前回の記事のコードをベースとしていきます(SurfaceViewを使用するのは前回と一緒なので)。今回は、そのコードに、定期的に描画するためのコードのみを追加したいと思います。まずは、ソースコードの全体を以下に示します。


package jp.sample.SampleSurViewCycle;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SampleSurViewCycle extends Activity {
// スレッドクラス
Thread mainLoop = null;
// 描画用
Paint paint = null;
// デバッグ用
int count = 0;

// SurfaceViewを描画するクラス
class DrawSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable{

public DrawSurfaceView(Context context) {
super(context);
// コンストラクタ。SurfaceView描画に用いるコールバックを登録する。
getHolder().addCallback(this);
// 描画用の準備
paint = new Paint();
paint.setColor(Color.BLUE);
paint.setAntiAlias(true);
paint.setTextSize(24);
// 加えて、スレッドを開始する
// 引数にはDrawSurfaceView、自分自身のインスタンスを渡す(Runnableをimplementsしていないといけない)。
mainLoop = new Thread(this);
// スレッドスタート。そうすると、runメソッドが実行される。
mainLoop.start();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO 今回は何もしない。
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
// SurfaceView生成時に呼び出されるメソッド。
// 今はとりあえず背景を白にするだけ。
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.WHITE);
holder.unlockCanvasAndPost(canvas);
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO 今回は何もしない。
}

@Override
public void run() {
// Runnableインターフェースをimplementsしているので、runメソッドを実装する
// これは、Threadクラスのコンストラクタに渡すために用いる。
while (true) {
Canvas canvas = getHolder().lockCanvas();
if (canvas != null)
{
canvas.drawColor(Color.WHITE);
canvas.drawText("count = " + count, 0, paint.getTextSize(), paint);
count++;
getHolder().unlockCanvasAndPost(canvas);
}
if (count == 100) {
break;
}
}
}

}

// アクティビティが生成されたときに呼び出されるメソッド
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new DrawSurfaceView(this));
}

@Override
public void onDestroy() {
super.onDestroy();
Thread.interrupted();
}
}

ポイント1として、DrawSurfaceViewクラスでRunnableインターフェースをimplementsしている点です。このインターフェースをimplementsすると、runというメソッドを実装します。これは、後述するThreadクラスをインスタンス化して、startさせると呼び出されるメソッドです。ここで、定期的に描画するコードを記載すると、SurfaceViewに定期的な描画が可能となります。リアルタイムOSで言うタスクのコードをrunメソッドに記載すれば良いイメージ?


なので、上記のコードのrunメソッドでは、while (true) で無限ループさせています。whileループ内では、PaintクラスとCanvasクラスのインスタンスを用いて、テキストをSurfaceViewに描画しています。ただし、同じテキストだと書き換えられたことが分からないので、countという変数をインクリメントさせて表示させています。


後は、このrunメソッドを呼び出すスレッドを生成するだけです。これは、Threadクラスをインスタンス化して、startメソッドを呼び出すことで実現できます。インスタンス化するときに、コンストラクタの引数にRunnableインターフェースをimplementsしたクラスのインスタンスを渡すということです。コードでは、


mainLoop = new Thread(this);

の部分です。その後、mainLoop.start();を実行すると、runメソッドが呼び出されます。


実行結果


SurfaceView_02_runnable.png


今回は、定期的にカウントアップしたcount変数の値をSurfaceViewに表示させています(0~99の間)。


おわりに


今回は、SurfaceViewを用いた定期的な描画を行うサンプルプログラムを作成してみました。今回は何も考えず、定期的にテキストを描画するだけですが、runメソッドの中をいろいろ書き換えれば、画像を表示したり、それを移動させたり、あるいはキーボードイベントやタッチイベントに応じて画像を移動させることもできると思います。次は、そのあたりのプログラムを作りたいと思います。


参考サイト





テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

sepiablue

Author:sepiablue
組込みソフトウェアエンジニアやってます。普段はC言語使い。
趣味はプログラミング、京都旅行で神社巡り。
AndroidアプリをMacで開発中。

最新記事
スポンサードリンク
スポンサードリンク
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。