Surfaceview를 이용해서 퍼즐게임을 만들고 있습니다.
40개 타일을 배치한다음 터치이벤트를 통해서 위에 사각형을 그리는데
너무 느리네요 ㅠㅠ... 어디가 잘못된걸까요...
//메인액티비티
public class MainActivity extends Activity {
private NemoView nemo;
private GestureDetector touch;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setBackgroundDrawable(null);
nemo = new NemoView(this);
setContentView(nemo);
touch = new GestureDetector(this, listener);
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (nemo.isDrawOn()) {
nemo.DrawSelectRect(0, 0, 0, 0, false);
}
}
return touch.onTouchEvent(event);
}
OnGestureListener listener = new OnGestureListener() {
public boolean onDown(MotionEvent e) {
return false;
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return false;
}
public void onLongPress(MotionEvent e) {
}
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
nemo.DrawSelectRect(e1.getX(), e1.getY(), e2.getX(), e2.getY(),
true);
return false;
}
public void onShowPress(MotionEvent e) {
}
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
};
}
//SurfaceView
public class NemoView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder;
private TileThread thread1;
private Canvas canvas;
private Tile[][] tile = new Tile[8][5];
private Random random;
private int wTile, hTile;
private Resources res;
private Bitmap bitmap;
private float rx, ry, rw, rh;
private boolean drawOn;
private Paint rect_paint;
public NemoView(Context context) {
super(context);
holder = getHolder();
holder.addCallback(this);
res = getResources();
random = new Random();
wTile = 120;
hTile = 120;
mkTiles();
rx = 0;
ry = 0;
rw = 0;
rh = 0;
drawOn = false;
rect_paint = new Paint();
rect_paint.setColor(Color.BLACK);
rect_paint.setStyle(Style.STROKE);
rect_paint.setStrokeWidth(15);
}
public void mkTiles() {
for (int i = 0; i <= 4; i++) {
for (int j = 0; j <= 7; j++) {
tile[j][i] = new Tile();
tile[j][i].setColor(random.nextInt(4));
}
}
}
public void DrawSelectRect(float x, float y, float w, float h, boolean on) {
if (on) {
rx = x;
ry = y;
rw = w;
rh = h;
drawOn = true;
} else {
rx = x;
ry = y;
rw = w;
rh = h;
drawOn = false;
}
}
public Bitmap setTile(int a){
switch(a){
case 0:
bitmap = BitmapFactory.decodeResource(res, R.drawable.dong1);
break;
case 1:
bitmap = BitmapFactory.decodeResource(res, R.drawable.star1);
break;
case 2:
bitmap = BitmapFactory.decodeResource(res, R.drawable.semo1);
break;
case 3:
bitmap = BitmapFactory.decodeResource(res, R.drawable.nemo1);
break;
}
return bitmap;
}
class TileThread extends Thread {
private SurfaceHolder holder;
private Canvas canvas;
private Paint paint;
public TileThread(SurfaceHolder holder) {
this.holder = holder;
paint = new Paint();
}
public void run() {
while (true) {
synchronized (holder) {
canvas = holder.lockCanvas();
canvas.drawColor(Color.WHITE);
for (int i = 0; i <= 4; i++) {
for (int j = 0; j <= 7; j++) {
canvas.drawBitmap(setTile(tile[j][i].getColor()),j*wTile,i*hTile,null);
}
}
if (drawOn) {
canvas.drawRect(rx, ry, rw, rh, rect_paint);
}
holder.unlockCanvasAndPost(canvas);
}
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
public void surfaceCreated(SurfaceHolder holder) {
thread1 = new TileThread(holder);
thread1.start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
}
public boolean isDrawOn() {
return drawOn;
}
public void setDrawOn(boolean drawOn) {
this.drawOn = drawOn;
}
}