본문 바로가기

Android/Current Location

안드로이드 구글맵에서 현재위치 찾고 표시하기

안드로이드 액티비티가 실행되면 현재위치를 화살표로 가르키는 예제

액티비티가 시작되면 현재 위치를 화면에 중앙에 보여주며 화살표로 가리킨다. 이용자가 화면을 드래그하여 지도를 이동하거나 멀티터치를 이용하여 지도를 확대/축소할 수 있는 것은 Google Map의 기본기능 그대로 사용할 수 있고, 또 화면을 터치한 후에 이동하지 않고 손을 떼면 해당 위치에 화살표를 그려준다.

package test.android.hello;


import java.util.*;


import android.content.Context;

import android.graphics.*;

import android.location.Criteria;

import android.location.Location;

import android.location.LocationListener;

import android.location.LocationManager;

import android.os.Bundle;

import android.view.*;


import com.google.android.maps.*;


public class GoogleMapActivity extends MapActivity implements LocationListener {


    MapView mapView; 

    MapController mapController;

    GeoPoint p;


    LocationManager locationMgr;

    

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.map_layout);


        mapView = (MapView) findViewById(R.id.mapview);

        mapView.displayZoomControls(true);

        mapController = mapView.getController();


        locationMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        Criteria criteria = new Criteria();

        criteria.setAccuracy(Criteria.NO_REQUIREMENT);

        criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);

        String best = locationMgr.getBestProvider(criteria, true);

        locationMgr.requestLocationUpdates(best, 1000, 0, this);

        

        MapOverlay mapOverlay = new MapOverlay();

        List<Overlay> listOfOverlays = mapView.getOverlays();

        listOfOverlays.clear();

        listOfOverlays.add(mapOverlay);   

        

        mapView.invalidate();

    }


    @Override

    protected boolean isRouteDisplayed() {

        return true;

    }

@Override

public void onLocationChanged(Location location) {

double lat = location.getLatitude();

double lon = location.getLongitude();

GeoPoint newPoint = new GeoPoint((int)(lat * 1E6), (int)(lon*1E6));

mapController.animateTo(newPoint);

p = newPoint;

}


@Override

public void onProviderDisabled(String provider) {}


@Override

public void onProviderEnabled(String provider) {}


@Override

public void onStatusChanged(String provider, int status, Bundle extras) {}

    

    class MapOverlay extends com.google.android.maps.Overlay  {

        @Override

        public boolean draw(Canvas canvas, MapView mapView, 

                                 boolean shadow, long when) {

            super.draw(canvas, mapView, shadow);                   


            //지리좌표를 화면픽셀좌표로 변환

            Point screenPts = new Point();

            if(p != null) mapView.getProjection().toPixels(p, screenPts);


            //위에서 변환한 화면좌표에 화살표 이미지를 그려준다

            Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.arrow);

            Paint paint = new Paint();

            paint.setAlpha(60);

            canvas.drawBitmap(bmp, screenPts.x-bmp.getWidth()/2, screenPts.y, paint);         

            return true;

        }

        /*

         ACTION_MOVE나 멀티터치의 경우에는 화면에 화살표를 그리지 않고 손가락으로 터치 후 업 동작을 할 경우에만

         해당 위치에 화살표를 그려주기 위해 좌표를 p 변수에 할당한다

        */

        boolean isTouched;

        @Override

        public boolean onTouchEvent(MotionEvent event, MapView mapView) {

        if(event.getAction()== MotionEvent.ACTION_DOWN) {

        isTouched = true;

        }else if(event.getAction()== MotionEvent.ACTION_MOVE) {

        isTouched = false;

        }

        if (event.getAction() == MotionEvent.ACTION_UP && isTouched) {

                // 터치된 화면의 좌표를 지리좌표로 변환한다 

                    GeoPoint touchGP = mapView.getProjection().fromPixels(

                    (int)event.getX(),

                    (int)event.getY());

                //android.util.Log.e("터치 이벤트", "위도:"+touchGP.getLatitudeE6()+", 경도:"+touchGP.getLongitudeE6());

                p = touchGP;

                isTouched = false;

                return false;

            }

            return false;

        }

    }

}