▼Androidメモ▼
テクスチャビュー


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



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

sample.png


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

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


TextureViewView.java
package net.npaka.textureviewex;
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.graphics.SurfaceTexture;
import android.view.TextureView;

//テクスチャビューの利用
public class TextureViewView extends TextureView
implements TextureView.SurfaceTextureListener,Runnable {
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 TextureViewView(Context context) {
super(context);

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

//テクスチャービューのリスナーの指定
setSurfaceTextureListener(this);
}

//サーフェイステクスチャ有効化時に呼ばれる
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface,int width,int height) {
//スレッドの開始
thread=new Thread(this);
thread.start();
}

//サーフェイステクスチャサイズ変更時に呼ばれる
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface,int width,int height) {
}

//サーフェイステクスチャ更新時に呼ばれる
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}

//サーフェイステクスチャ破棄時に呼ばれる
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
thread=null;
return true;
}

//ループ処理
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=lockCanvas();
if (canvas==null) return;
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(image,px-120,py-120,null);
unlockCanvasAndPost(canvas);

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



−戻る−