안녕하세요.

안드로이드 초보 개발자입니다.

현재 기본 갤러이에서 이미지를 선택하면

그 이미지를 불러와 surfaceview 위에 bitmap으로 그려서 놓고

드래그 앤 드롭(?) 암튼 움직일 수 있게끔 하였습니다.

어떻게 바꿔야 되는지좀 알려주세요ㅠ

===========================

1. 갤러리 호출 부분

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, REQ_IMAGE_SELECT);


2. surfaceview 시작부분

class UserSpace extends SurfaceView implements SurfaceHolder.Callback, Runnable {
 private Context mContext;
 private SurfaceHolder holder;
 
 private Bitmap imgMove;
 private int moveX = 0;
 private int moveY = 0;
 private int imgWidth = 0;
 private int imgHeight = 0;
 private int moveLength = 40;
 private Thread thread = null;
 private Point pImage;
 private Point pWindow;
 private boolean bMove = false;
 private boolean mbRun = true;
 private int mouseX = 0;
 private int mouseY = 0;

 public UserSpace(Context context) {
  super(context);
  mContext = context; 
  
  // SurfaceHolder Create
  holder = getHolder();
  holder.addCallback(this);
  holder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
  setFocusable(true);
 }

 /** surface 가 변경될때 */
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
 }

 /** surface 가 생성될때 */
 public void surfaceCreated(SurfaceHolder holder) {

 
  mbRun = true;

  // window 크기
  pWindow = new Point();
  pWindow.x = 150;
  pWindow.y = 150;

  // 이미지 위치
  pImage = new Point(10, 10);
  Resources res = getResources();

  Bitmap tempBitmap = VisualShare.selPhoto;  갤러리에서 선택한 이미지를 bitmap으로 담아옴

  imgWidth = 150;
  imgHeight = 150;

  // 표시할 위치
  moveX = pWindow.x;
  moveY = pWindow.y;

  // 이미지 그리기
  imgMove = Bitmap.createScaledBitmap(tempBitmap, imgWidth, imgHeight,
    true);
  setClickable(true);
  thread = new Thread(this);
  thread.start();
 }

 public void surfaceDestroyed(SurfaceHolder holder) {

  mbRun = false;

  try {
   thread.join();
   // thread.interrupt();
  } catch (Exception e) {
   Log.e(this.getClass().getName(), e.getMessage());
  }
 }

 public void run() {
  // Canvas 의 사이즈
  pWindow.x = getWidth();
  pWindow.y = getHeight();

  while (mbRun) {
   Canvas c = null;

   try {
    c = holder.lockCanvas(null);
    synchronized (holder) {
     doDraw(c);
     Thread.sleep(50);
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   } finally {
    if (c != null) {
     holder.unlockCanvasAndPost(c);
    }
   }
  }
 }

 private void doDraw(Canvas cv) {

  pImage.x = moveX;
  pImage.y = moveY;
  cv.drawColor(Color.rgb(151, 50, 50)); //  새로그림
  cv.drawBitmap(imgMove, moveX - 80, moveY - 80, null);
 }

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  switch (keyCode) {
  case KeyEvent.KEYCODE_DPAD_LEFT:
   if (moveX > 0) {
    moveX -= moveLength;
   }
   break;
  case KeyEvent.KEYCODE_DPAD_RIGHT:
   if ((moveX + imgWidth) < pWindow.x) {
    moveX += moveLength;
   }
   break;
  case KeyEvent.KEYCODE_DPAD_UP:
   if (moveX > 0) {
    moveY -= moveLength;
   }
   break;
  case KeyEvent.KEYCODE_DPAD_DOWN:
   if ((moveY + imgHeight) < pWindow.y) {
    moveY += moveLength;
   }
   break;
  case KeyEvent.KEYCODE_DPAD_CENTER:
   break;
  }
  return super.onKeyDown(keyCode, event);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  int keyAction = event.getAction();
  int x = (int) event.getX();
  int y = (int) event.getY();
  mouseX = x;
  mouseY = y;
  switch (keyAction) {
  case MotionEvent.ACTION_MOVE:
   if (bMove) {
    moveX = x;
    moveY = y;
   }
   break;
  case MotionEvent.ACTION_UP:
   bMove = false;
   break;
  case MotionEvent.ACTION_DOWN:
   this.checkImageMove(x, y);
   break;
  }
  // 함수 override 해서 사용하게 되면 return 값이 super.onTouchEvent(event) 되므로
  // MOVE, UP 관련 이벤트가 연이어 발생하게 할려면 true 를 반환해주어야 한다.
  return true;
 }

 /**
  * 현재 이미지위에 마우스가 위치하는지 판단한다.
  *
  * @param x
  * @param y
  */
 private void checkImageMove(int x, int y) {
  int inWidth = 80;
  int inHeight = 60;
  if ((pImage.x - inWidth < x) && (x < pImage.x + inWidth)) {
   if ((pImage.y - inHeight < y) && (y < pImage.y + inHeight)) {
    bMove = true;
   }
  }
 }
}