안녕하세요.
안드로이드 초보 개발자입니다.
현재 기본 갤러이에서 이미지를 선택하면
그 이미지를 불러와 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;
}
}
}
}




이와 같은 처리는 굳이 SurfaceView를 쓰지 않아도 구현 가능합니다.
말씀하신 동작을 처리하려면 각 이미지에 대한 정보를을 관리하는 정보 객체들을 우선 만들고 이를 프로젝션으로 만들고 관련 사항을 이벤트가 발생되면 해당 정보 갱신을 하고 매번 View에서 관리 해주는 방식으로 처리해야 합니다.
그래픽 관련 서적부터 차근차근 공부하시는게 많은 도움이 될 것으로 생각됩니다.