제가 지금 서피스뷰를 통해 제작한 실내지도 이미지를 이미지좌표와 화면픽셀좌표를 1대1로 매칭하여 내 위치를 표시해주고있습니다. 그런데 지도에 확대 축소 기능을 추가하려고 하는데 이게 픽셀좌표가 절대좌표 이기 때문에 확대를 할 경우 계산되어서 나오는 실제위치좌표와 화면상좌표에 위치가 달라지게 됩니다. 이 부분을 해결할 방안이 있을까요? 혹시 실내지도 이미지에 가상의 좌표를 입히는 방법이 있나요?
package com.perples.recosample;
import java.util.ArrayList;
import com.perples.recosdk.RECOBeacon;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
public class MyView extends SurfaceView implements Callback {
public MyView(Context context) {
super(context);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
thread = new ImgThread(holder, context);
setFocusable(true);
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
thread.start();
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
boolean retry = true;
while(retry){
try{
thread.join();
retry = false;
}catch (InterruptedException e){
}
}
}
//이부분이 좌표를 구해주는 부분(이미지의 픽셀좌표중 고정값 3개를 두고 디바이스와 고정좌표와의 거리를 받아와 계산해서 이미지픽셀에서의 나의 위치를 계산해줌)
public static void trilaterate(ArrayList<RECOBeacon> beacons) {
Log.v("tag", "msg1");
double X=0;
double Y=0;
Trilateration trilateration = new Trilateration(beacons);
Cordination coordination = trilateration.computePosition();
X = coordination.getX();
Y = coordination.getY();
//X,Y가 계산된 나의 위치
Log.v("tag", "AVR"+ X);
if(X!=0 && Y!=0){
thread.setX((int)X);
thread.setY((int)Y);
//좌표를 쓰레드로 넘겨줘 내위치를 그려줌
}
}
//여기서 배경지도와 나를 표시해주는 이미지를 그려줌
class ImgThread extends Thread{
private Bitmap mImgBack;
private Drawable mManImage;
private SurfaceHolder mSurfaceHolder;
private int xpos = 0;
private int ypos=0;
public ImgThread(SurfaceHolder surfaceHolder, Context context){
mSurfaceHolder = surfaceHolder;
Resources res = context.getResources();
mImgBack = BitmapFactory.decodeResource(context.getResources(), R.drawable.back);
mManImage = res.getDrawable(R.drawable.androidrobot);
mImgBack = Bitmap.createScaledBitmap(mImgBack, 720, 1080, true);
//화면상 이미지크기를 실제 이미지크기와 똑같게 고정시켜놓음
}
public void run() {
while (true) {
Canvas canvas = null;
try{
canvas = mSurfaceHolder.lockCanvas(null);
synchronized(mSurfaceHolder){
canvas.drawBitmap(mImgBack, 0, 0, null);
//배경이미지를 그려줌
mManImage.setBounds(xpos,ypos,xpos+30,ypos+60);
mManImage.draw(canvas);
//나의 위치 이미지를 그려줌
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setTextSize(18);
canvas.drawText("x="+xpos+"y="+ypos,0,20*1,paint);
sleep(100);
sleep(100);
}
}catch (InterruptedException e){
e.printStackTrace();
}finally{
if(canvas != null){
mSurfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
void setXPos(int val){
xpos += val;
}
void setYPos(int val){
ypos += val;
}
void setX(int val){
xpos = val-15;
}
void setY(int val){
ypos = val-30;
}
}
private static ImgThread thread;
}