package AnimalShooting.com;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable.Callback;
import android.view.Display;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;

public class AnimalShootingView extends SurfaceView implements Callback,
  android.view.SurfaceHolder.Callback {
 // 변수 선언
 public static boolean RUN = true;
 public static boolean PUSE = false;
 public boolean mMode = true; // 게임 멈춤 값
 int x, y, Hero_X, Hero_Y, DS_W, DS_H, Hero_W, Hero_H, Hero_S, Tcuch_X,
   Tcuch_Y, Back_H;// 변수 선언
 int Counter = 0; // 이미지 변경 조건 값
 Bitmap Hero_image[] = new Bitmap[3];// 캐릭터 이미지 (히어로)
 Bitmap Background; // 배경이미지 선언
 GameThread mThread;
 boolean GameRun = true; // 스레드 종료 스위치 값
 SurfaceHolder mHolder;
 
 public AnimalShootingView(Context context) { // 변수값 설정
  super(context);
  SurfaceHolder holder = getHolder();
  holder.addCallback(this);
  mThread = new GameThread(context, holder);
 } // public AnimalShootingView END

 public void surfaceCreated(SurfaceHolder arg0) { // Surface 가 생성될 때 호출
  mThread.start();

 } // surfaceCreated END

 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // Surface
                     // 가
                     // 바뀔때
                     // 호출

 } // surfaceChanged END

 public void surfaceDestroyed(SurfaceHolder arg0) { // Surface 가 삭제될 때 호출
  // TODO Auto-generated method stub
  while (GameRun) {
   try {
    System.exit(0);
    mThread.join();
    GameRun = false;
   } catch (InterruptedException e) {
    //
   }
  }

 } // surfaceDestroyed END

 // ---------------------------------------------------------------------------------
 // Thread 업무
 // ---------------------------------------------------------------------------------

 class GameThread extends Thread {


  public GameThread(Context context, SurfaceHolder holder) {
   mHolder = holder;
   Background = BitmapFactory.decodeResource(context.getResources(),
     R.drawable.map01);

   Display DSP = ((WindowManager) context
     .getSystemService(Context.WINDOW_SERVICE))
     .getDefaultDisplay();
   DS_W = DSP.getWidth(); // view 가로 화면 길이
   DS_H = DSP.getHeight(); // View 세로 화면 길이
   Hero_image[0] = BitmapFactory.decodeResource(getResources(),
     R.drawable.dog01);
   Hero_image[1] = BitmapFactory.decodeResource(getResources(),
     R.drawable.dog02);
   Hero_W = Hero_image[0].getWidth() / 2;// 캐릭터(히어로) 가로 중심 값
   Hero_H = Hero_image[0].getHeight() / 2;// 캐릭터(히어로) 세로 중심 값
   Hero_S = 10; // 캐릭터(히어로) 이동속도
   Hero_X = DS_W / 2; // 캐릭터 x 좌표
   Hero_Y = ((DS_H / 3) + (DS_H / 2)) - Hero_H; // 캐릭터 y 좌표
   Tcuch_X = Hero_X;
   Tcuch_Y = Hero_Y;
   Back_H = -1000;
   Background = Bitmap
     .createScaledBitmap(Background, DS_W, (Back_H- DS_H), true); // 배경화면
                  // 해상도에
                  // 맞게 변경
  }

  public void run() { // 스레드 실행 부분
   while (GameRun) {
    Canvas canvas = null;
    
    try {
     synchronized (mHolder) {
      canvas = mHolder.lockCanvas();
      ScrollImage(); // Viewport 이동
      canvas.drawBitmap(Background, 0, (Back_H + DS_H), null);
      Counter++;
      int n = Counter % 20 / 10; // 캐릭터(히어로)애니 메이션 변화 기준

      if (Hero_X < DS_W && Hero_X < Tcuch_X
        && Hero_X != Tcuch_X) {
       Hero_X += Hero_S;
      }
      if (Hero_X > 10 && Hero_X > Tcuch_X
        && Hero_X != Tcuch_X) {
       Hero_X -= Hero_S;
      }
      if (Hero_Y < DS_H && Hero_Y < Tcuch_Y
        && Hero_Y != Tcuch_Y) {
       Hero_Y += Hero_S;
      }
      if (Hero_Y > 10 && Hero_Y > Tcuch_Y
        && Hero_Y != Tcuch_Y) {
       Hero_Y -= Hero_S;
      }

      x = Hero_X - Hero_W;
      y = Hero_Y - Hero_H;

      canvas.drawBitmap(Hero_image[n], x, y, null);

     }
    } finally {
     mHolder.unlockCanvasAndPost(canvas);
    }
   } // while END
  } // run END

 } // GameThread END

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  if (mMode == false) {
   return false;
  }
  // 터치 한 곳의 X,Y의 값을 구한다.
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
   Tcuch_X = (int) event.getX();
   Tcuch_Y = (int) event.getY();
  } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
   Tcuch_X = (int) event.getX();
   Tcuch_Y = (int) event.getY();
  } else if (event.getAction() == MotionEvent.ACTION_UP) {
   Tcuch_X = (int) event.getX();
   Tcuch_Y = (int) event.getY();
  }

  return true;
 }// onTouchEvent End

 public void ScrollImage() {// 배경 Scroll
  // TODO Auto-generated method stub
  if (mMode == false) {
   return; 
  }
  // 맵의 이미지를 움직인다.
  Back_H += 5;
 }

} // class AnimalShootingView END

 

여기에 보면 surfaceView를 이용해서 맵의 뒤 배경을 움직이는데 정상으로 움직이닥

맵이 일그러져 보이더니 캐릭터와 잔상이 막 생기네요 ㅜㅜ 어떻게 해야 될까요 도와주세요

맵 이미지 크기는 320*1000 입니다