戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10

スポンサーサイト

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

描画Viewクラス : SurfaceView

SurfaceView は描画を行うViewクラスのひとつです。

ビュー(ウィジェット)はアプリケーションのメインスレッド(UIスレッド)で描画が行われていますが SurfaceView は描画スレッドが独立しているため、メインスレッドで処理をしながら描画を行うことができます。

そのため、計算と描画を同時に行う必要のあるゲームプログラミング等で使われています。

※ SurfaceView はダブルバッファリングが行われています。使用する際には注意してください。
【関連記事】SurfaceViewとダブルバッファリング

API Reference:
SurfaceView

ソフトウェア技術ドキュメントを勝手に翻訳
Android 開発ガイド‎ - ‎フレームワークトピック‎ - b. グラフィックス

■ 画面イメージ -----------------------------------------------
android_SurfaceView.png
# 動きが無いのでImageViewとの違いがわからないですね…

■ ソースコード -----------------------------------------------
package jp.inujirushi.sample.view;

import jp.inujirushi.sample.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SampleSurfaceView extends SurfaceView implements
SurfaceHolder.Callback {

/**
* コンストラクタ
*
* @param context
*/
public SampleSurfaceView(Context context) {
super(context);

// SurfaceViewにコールバックを追加(開始)する
getHolder().addCallback(this);
}

/**
* コンストラクタ
* XMLから呼び出すときには AttributeSet を含むコンストラクタを実装する必要があります
*
* @param context
* @param attrs
*/
public SampleSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);

// SurfaceViewにコールバックを追加(開始)する
getHolder().addCallback(this);
}

/**
* SurfaceViewが生成されたときに呼ばれます
*
* @param holder
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
// Canvasをロックして取得する
Canvas canvas = holder.lockCanvas();

// Canvasに描画する
Bitmap bitmap = BitmapFactory.decodeResource(
getResources(), R.drawable.icon);
canvas.drawBitmap(bitmap, 0, 0, null);
canvas.drawBitmap(bitmap, 50, 50, null);
canvas.drawBitmap(bitmap, 100, 100, null);
bitmap.recycle();

// Canvasのロックを解除する
holder.unlockCanvasAndPost(canvas);
}

/**
* SurfaceViewの状態が変更されたときに呼ばれます。
* SurfaceViewが生成されたときにも呼ばれます。
*
* @param holder
* @param format
* @param width
* @param height
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}

/**
* SurfaceViewが破棄されるときに呼ばれます
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}


■ 使い方 -----------------------------------------------------
res/layout/sample_surface.xml (XMLを使用しないのであれば不要)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<jp.inujirushi.sample.view.SampleSurfaceView
xmlns:app="http://schemas.android.com/apk/res/jp.inujirushi.sample.view"
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
独自Viewを使用しているため、タグ名、および、xmlns:app にパッケージを記述する必要があります。


Javaソースコード
package jp.inujirushi.sample.activity;

import jp.inujirushi.sample.R;
import android.app.Activity;
import android.os.Bundle;

public class SurfaceViewActivity extends Activity {

/** アクティビティを生成した時に呼ばれます。 */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sample_surface);

// XMLに定義しない場合はnewすればOK
//setContentView(new SampleSurfaceView(this));

// SurfaceViewを取得するには findViewById を使う
//SampleSurfaceView view = (SampleSurfaceView) findViewById(R.id.surfaceView);
}
}
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

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