안드로이드의 SurfaceView 에서 Thread를 사용하는 예
SurfaceView에서는 화면에 그리기 위한 메소드를 직접 정의해야 하고 그 메소드를 쓰레드에서 직접호출하여 화면에 출력할 수 있다
MainActivity.java
package com.example.androidapp; import android.app.Activity; import android.graphics.Point; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.widget.TextView; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new Tank(this)); } }
Tank.java
package com.example.androidapp; import android.content.Context; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.util.AttributeSet; import android.util.Log; public class Tank extends SurfaceView implements SurfaceHolder.Callback { Canvas cacheCanvas; Bitmap backBuffer; SurfaceHolder mHolder; public Tank(Context context) { super(context); init(); } public Tank(Context context, AttributeSet attrs) { super(context, attrs); init(); } int width, height, sx, sy; Bitmap bitmapTank, invTank, tank; Matrix matrix, horInvMatrix; int delta = -5; private void init() { mHolder = getHolder(); mHolder.addCallback(this); } private void draw() {//자동으로 호출되는 onDraw() 와 같은 메소드가 없기 때문에 직접 그리는 메소드를 정의한다 Canvas canvas = null; try{ canvas = mHolder.lockCanvas(null); //back buffer에 그려진 비트맵을 스크린 버퍼에 그린다 canvas.drawColor(Color.WHITE); canvas.drawBitmap(backBuffer, sx, sy, null); }catch(Exception ex){ ex.printStackTrace(); }finally { mHolder.unlockCanvasAndPost(canvas); } } public void surfaceCreated(SurfaceHolder holder) { width = getWidth(); height = getHeight(); cacheCanvas = new Canvas(); bitmapTank = BitmapFactory.decodeResource(getResources(), R.drawable.tank); backBuffer = Bitmap.createBitmap( bitmapTank.getWidth(), bitmapTank.getHeight(), Bitmap.Config.ARGB_8888); cacheCanvas.setBitmap(backBuffer); cacheCanvas.drawColor(Color.WHITE); sx = width/2-(bitmapTank.getWidth()/2); sy = height/2-(bitmapTank.getHeight()/2); matrix = new Matrix(); horInvMatrix = new Matrix(); horInvMatrix.setScale(-1, 1); //원본 비트맵을 좌우로 뒤집어서 복사하여 사본 비트맵을 생성한다 invTank = Bitmap.createBitmap(bitmapTank, 0, 0, bitmapTank.getWidth(), bitmapTank.getHeight(), horInvMatrix, false); tank = bitmapTank; new Thread(){ public void run() { while(true) { if(sx<=0) { tank = invTank; delta *= -1; }else if(sx >= width-backBuffer.getWidth()){ tank = bitmapTank; delta *= -1; } cacheCanvas.drawBitmap(tank, matrix, null); //back buffer에 그린다 sx+=delta; draw(); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} public void surfaceDestroyed(SurfaceHolder holder) {} }