サーフェスビューを使ってメインループを作るには

以下にビューのサンプルを記載します。

      
import java.util.Random;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
  private SurfaceHolder mHolder;
  private Thread mMainLoop;
  private final String TAG = "MySurfaceView";
  public MySurfaceView(Context context) {
    super(context);
    Log.v(TAG,"MySurfaceView()");
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setFixedSize(getWidth(), getHeight());
  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
    Log.v(TAG,"surfaceDestroyd()");
    mMainLoop = null;
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    Log.v(TAG, "surfaceChanged()");
    mMainLoop = new Thread(this);
    mMainLoop.start();
  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) {
    Log.v(TAG, "surfaceCreated()");
  }

  @Override
  public void run() {
    Log.v(TAG,"run()");
    long seed = System.currentTimeMillis();
    Random rnd = new Random(seed);
    int w = getWidth();
    int h = getHeight();
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(Color.WHITE);
    paint.setTextSize(32.0f);
    paint.setTypeface(Typeface.MONOSPACE);
    Integer count = new Integer(0);

    while (mMainLoop != null) {
      int x0 = rnd.nextInt(w);
      int y0 = rnd.nextInt(h);

      Canvas canvas = mHolder.lockCanvas();
      canvas.drawText(count.toString(), x0, y0, paint);
      mHolder.unlockCanvasAndPost(canvas);
      count = ++count % 10;

      try {
        Thread.sleep(50);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//End of Files
/////////////////////////////////////////////////////////////////////////////////////////////////
      
    

コメントが無いので解説を・・・
メインのループはThreadを使って実装します。
surfaceChangedでスレッドを作成し、
surfaceDestroyedでスレッドを削除しています。
スレッドが存在している間はrun内で無限ループし、
処理を行う毎に50ms処理を停止しています。

また、メイン側での実装は以下のように行います。

      
import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;

public class Main extends Activity {
  @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      LinearLayout layout = new LinearLayout(this);
      setContentView(layout);
      layout.addView(new MySurfaceView(this));
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    finish();
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//End of Files
/////////////////////////////////////////////////////////////////////////////////////////////////
      
    

戻る