본문 바로가기

Android/Overlay on TouchEvent

Google Map 예제, 지도상의 터치된 곳에 이미지 출력하기

Google MapView 와 MapActivity 를 이용한 화면에서 이용자가 지도상의 특정 위치를 터치하면 해당 위치에 화살표 그리기

package test.android.hello;


import java.util.*;


import android.graphics.*;

import android.os.Bundle;

import android.view.*;


import com.google.android.maps.*;


public class GoogleMapActivity extends MapActivity {


    MapView mapView; 

    MapController mapController;

    GeoPoint p;


    @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();

        // 37517180, 127041268 강남구청

        String coordinates[] = {"37.517180", "127.041268"};

        double lat = Double.parseDouble(coordinates[0]);

        double lng = Double.parseDouble(coordinates[1]);


        p = new GeoPoint((int)(lat*1E6), (int)(lng*1E6));


        mapController.animateTo(p);

        mapController.setZoom(17); 


        MapOverlay mapOverlay = new MapOverlay();

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

        listOfOverlays.clear();

        listOfOverlays.add(mapOverlay);        


        mapView.invalidate();

    }


    @Override

    protected boolean isRouteDisplayed() {

        return true;

    }


    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();

            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;

        }


        @Override

        public boolean onTouchEvent(MotionEvent event, MapView mapView) 

        {   

            if (event.getAction() == event.ACTION_UP) {

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

                GeoPoint touchGP = mapView.getProjection().fromPixels(

                    (int)event.getX(),

                    (int)event.getY());

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

                p = touchGP;

                return false;

            }

            else return false;

        }

    }

}