スポンサーサイト

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

SurfaceViewの使い方1

はじめに


今回からは、SurfaceViewクラスについて、調べていきます。SurfaceViewクラスは、@IT「SurfaceViewならAndroidで高速描画ゲームが作れる」にもあるように、ゲームアプリなどで、定期的に描画が必要となる場合に効果を発揮するクラスです。


今回は、まず@IT「SurfaceViewならAndroidで高速描画ゲームが作れる」にあるサンプルコード(zip圧縮したもの)を利用しようと思います。


と思いましたが、このサンプルコードには、大変親切なことにいろいろなサンプルをListViewで選択して試すことができるようで、SurfaceView導入編としては敷居が高いかも・・・と思ったので、やはりシンプルに最初から順々にやっていきます。ただし、@ITのサンプルコードは多いに参考させていただきます。参考とするコードはHello.javaです。


プロジェクトの新規作成


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



  • プロジェクト名:SampleSurView

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

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

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

  • Create Activity:SampleSurView


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


今回はリソースレイアウトを使用しないため、main.xmlファイルはデフォルトのままでOK。


ソースコードの修正


方針


SampleSurView.javaファイルをいじくっていきます。今回SurfaceViewを使用するために、メインクラスであるSampleSurViewクラスのサブクラスとして、DrawSurfaceViewクラスを作ることにします(コードの全体は以下)。このサブクラスがSurfaceViewを作って描画します。


package jp.sample.SampleSurView;

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.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SampleSurView extends Activity {
// SurfaceViewを継承したサブクラス
class DrawSurfaceView extends SurfaceView implements SurfaceHolder.Callback {

public DrawSurfaceView(Context context) {
// コンストラクタ
super(context);
// SurfaceHolderを取得するために、getHolderメソッドを呼び出す
// そして、コールバックを登録するために、addCallbackメソッドも呼び出す。
getHolder().addCallback(this);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// SurfaceViewのサイズなどが変更されたときに呼び出されるメソッド。
// 今回は何もしない(ログ表示のみ)。
Log.d("SampleSurView", "surfaceChanged called.");
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
// SurfaceViewが最初に生成されたときに呼び出されるメソッド
Log.d("SampleSurView", "surfaceCreated called.");

// SurfaceHolderからCanvasのインスタンスを取得する
Canvas canvas = holder.lockCanvas();
// Paintクラスのインスタンスを作る。これは、描画するときに使用する
// 色は青、アンチエイリアスON、テキストサイズ24
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setAntiAlias(true);
paint.setTextSize(24);
// Canvasの背景色を白で塗る
canvas.drawColor(Color.WHITE);

// Canvasに文字を書く。ここでPaintクラスのインスタンスを用いる。
// つまり、青色でテキストサイズが24でアンチエイリアスのかかった「Sample Text」を描画する
canvas.drawText("Sample Test", 0, paint.getTextSize(), paint);

// 描画が終わったら呼び出すメソッド。
holder.unlockCanvasAndPost(canvas);
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// SurfaceViewが破棄されるときに呼び出されるメソッド
// 今回は実装しない。
Log.d("SampleSurView", "surfaceDestroyed");
}

}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// *注意:ここはレイアウトリソースであるR.layout.mainを使用せず、
//     SurfaceViewを継承したサブクラスDrawSurfaceViewのインスタンスを渡す。
setContentView(new DrawSurfaceView(this));
}
}

ポイント


このサブクラスは、SurfaceViewを使用するために、SurfaceViewクラスを継承(extends)します。また、SurfaceViewを使用するために、SurfaceHolder.Callbackクラスのインターフェースを実装しないといけないため、implementsします。


また、SurfaceHolder.Callbackクラスをimplementsすると、3つのメソッドsurfaceChanged、surfaceCreated、surfaceDestroyedを実装しなければなりません。今回のサンプルでは、surfaceCreatedメソッド、つまりSurfaceViewが生成されたときに呼び出されるメソッド、のみ実装しています。ここでは、SurfaceViewを白で塗りつぶして、「Sample Text」というテキストを青色で表示します。


最後に重要なポイントとしては、SampleSurViewクラスのonCreateメソッドでsetContentViewメソッドを呼んでいますが、通常はR.layout.mainというようにリソースレイアウトを指定します。しかし今回は、DrawSurfaceViewクラスのインスタンスを渡しています。今の私にはよく分かりませんが、SurfaceViewを使用する際はこれが一般的だそうです(by @IT)。


実行結果


エミュレータで起動すると、アプリが起動して以下のような実行結果となります。うまく表示できました。


SurfaceView_01_showText.png

一応アンチエイリアスはONにしていますが、見た目汚いように思います。テキストを表示するときはBMPファイルなどにしたほうが良いかも。


おわりに


今回は起動時に一度だけ描画するのみなので、SurfaceViewのありがたみがまったく分かりませんでした。次は定期的に描画するプログラムを作成してみたいと思います。


[メモ]最初、Android SDK 1.6でSurfaceViewを使用したコードを実行すると、なぜか「NullPointerException」例外が発生して実行できませんでした。いろいろ調べてみると、どうやらEclipse 64bit版をインストールしていたことが原因だったようでした。アンインストールして32bit版Eclipseをインストールすると、うまく動いたので・・・64bitアプリというのは、何かと問題があるようです。





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

コメントの投稿

非公開コメント

承認待ちコメント

このコメントは管理者の承認待ちです
プロフィール

sepiablue

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

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