마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

서피스뷰에관한 질문입니다.

0 추천
제가 지금 서피스뷰를 통해 제작한 실내지도 이미지를 이미지좌표와 화면픽셀좌표를 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;
    
    

}
lgr (280 포인트) 님이 2015년 10월 14일 질문
lgr님이 2015년 10월 14일 수정

1개의 답변

0 추천
차피 확대 축소를 하신다면 메트릭스를 쓰시게 될텐데.....
메트릭스값안에 비율이 저장되어집니다. 해당 값으로 좌표를 계산해서 찍어주시면 되요~!

matrix 검색하시면 많은 정보들이 있을겁니다~~!
ThisPlus (46,920 포인트) 님이 2015년 10월 15일 답변
...