SurfaceView上でオフスクリーンバッファを作成する方法

1,261 views
Skip to first unread message

mobmob

unread,
Jun 5, 2009, 12:58:22 AM6/5/09
to 日本Androidの会
はじめまして。mobmobと申します。宜しくお願いいたします。

質問させて下さい。

J2MEで作成したゲームをAndroidに移植しようと試みているのですが、Androidではアプリ側でダブルバッファリングでいうところのオフス
クリーンバッファを作成するようなことはできるのでしょうか?

移植しているゲームの基本的なモデルはSDK付属のサンプル「LunarLander」を参考にSurfaceViewで実装しています。

J2MEでは「Image.createImage(int windth, int height)」メソッドを使用すると戻り値としてオフスクリー
ンを取得できるですが、Androidではそれに相当するものを見つけることができませんでした。

やりたいこととしては、オフスクリーンバッファをアプリ側で複数枚保持できるようにして、適時Canvasに描画するような仕組みを実装したいので
す。

よい方法があればご教示して頂ければと思います。

宜しくお願い致します。

Keiji Ariyama

unread,
Jun 5, 2009, 4:43:02 AM6/5/09
to android-g...@googlegroups.com
有山@大阪です。
出先から失礼します。

Bitmap.createBitmap(...)
new Canvas(Bitmap)でどうでしょう。

Keiji

On 2009/06/05, at 13:58, mobmob <ekms...@gmail.com> wrote:

>
> はじめまして。mobmobと申します。宜しくお願いいたします。
>
> 質問させて下さい。
>
> J2MEで作成したゲームをAndroidに移植しようと試みているので
> すが、Androidではアプリ側でダブルバッファリングでいうとこ
Message has been deleted
Message has been deleted

mobmob

unread,
Jun 8, 2009, 1:51:53 AM6/8/09
to 日本Androidの会
mobmobです。

仰るとおりBitmap#createBitmapでオフスクリーンを作ることができました。
> Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888)

DevGuideのGraphicsにこのへんのことが書かれていたのですが理解が浅すぎました。
せっかくなので検証に使用したサンプルコードのほう記載させて頂きます。

ありがとうございました。


public class SurfaceViewOffscreenTest extends SurfaceView implements
SurfaceHolder.Callback, Runnable {

private SurfaceHolder holder;
private Thread mainLoopThread;
private Bitmap offscreen;

public SurfaceViewOffscreenTest(Context context) {
super(context);
holder = getHolder();
holder.addCallback(this);
holder.setFixedSize(getWidth(), getHeight());
}

public void surfaceCreated(SurfaceHolder holder) {
mainLoopThread = new Thread(this);
mainLoopThread.start();
}

public void surfaceDestroyed(SurfaceHolder holder) {
mainLoopThread = null;
}

public void surfaceChanged(SurfaceHolder holder, int format, int
w, int h) {
}

public void run() {

Canvas canvas;

// オフスクリーンは1度だけ作り、2回目以降はオフスクリーンを描画するだけ
while (mainLoopThread != null) {

canvas = holder.lockCanvas();
if (offscreen == null) {

offscreen = Bitmap.createBitmap(canvas.getWidth(),
canvas.getHeight(),
Bitmap.Config.ARGB_8888);

Canvas offCanvas = new Canvas(offscreen);
offCanvas.setBitmap(offscreen);
offCanvas.drawColor(Color.WHITE);
offCanvas.drawText("Offscreen buffer test.", 20, 20,
new Paint());

}
canvas.drawBitmap(offscreen, 0, 0, null);
holder.unlockCanvasAndPost(canvas);
}
}
}

On 6月5日, 午後5:43, Keiji Ariyama <keiji_ariy...@c-lis.co.jp> wrote:
> 有山@大阪です。
> 出先から失礼します。
>
> Bitmap.createBitmap(...)
> new Canvas(Bitmap)でどうでしょう。
>
> Keiji
>
Reply all
Reply to author
Forward
0 new messages