▼Androidメモ▼
サーフェイスビュー


画像が画面内をバウンドしながら移動するプログラムを作成する。



リソース
画像「sample.png」を「res/drawable-npdpi」に追加。

sample.png


ソースコード
SurfaceViewEx.java
package net.npaka.surfaceviewex;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

//サーフェイスビューの利用
public class SurfaceViewEx extends Activity {
//アクティビティ起動時に呼ばれる
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new SurfaceViewView(this));
}
}


SurfaceViewView.java
package net.npaka.surfaceviewex;
import android.content.res.Resources;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

//サーフェイスビューの利用
public class SurfaceViewView extends SurfaceView
implements SurfaceHolder.Callback,Runnable {
private SurfaceHolder holder;//サーフェイスホルダー
private Thread thread;//スレッド

private Bitmap image;//イメージ
private int px=0; //X座標
private int py=0; //Y座標
private int vx=10;//X速度
private int vy=10;//Y速度

//コンストラクタ
public SurfaceViewView(Context context) {
super(context);

//画像の読み込み
Resources r=getResources();
image=BitmapFactory.decodeResource(r,R.drawable.sample);

//サーフェイスホルダーの生成
holder=getHolder();
holder.addCallback(this);
}

//サーフェイスの生成
public void surfaceCreated(SurfaceHolder holder) {
//スレッドの開始
thread=new Thread(this);
thread.start();
}

//サーフェイスの変更
public void surfaceChanged(SurfaceHolder holder,
int format,int w,int h) {
}

//サーフェイスの破棄
public void surfaceDestroyed(SurfaceHolder holder) {
thread=null;
}

//ループ処理
public void run() {
while(thread!=null) {
long currentTime=System.currentTimeMillis();
onTick();
try {
Thread.sleep(30-currentTime%30);
} catch (Exception e) {
}
}
}

//定期処理
private void onTick() {
//ダブルバッファリング
Canvas canvas=holder.lockCanvas();
if (canvas==null) return;
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(image,px-120,py-120,null);
holder.unlockCanvasAndPost(canvas);

//移動
if (px<0 || getWidth()<px) vx=-vx;
if (py<0 || getHeight()<py) vy=-vy;
px+=vx;
py+=vy;
}
}



−戻る−