안드로이드 액티비티가 실행되면 현재위치를 화살표로 가르키는 예제
액티비티가 시작되면 현재 위치를 화면에 중앙에 보여주며 화살표로 가리킨다. 이용자가 화면을 드래그하여 지도를 이동하거나 멀티터치를 이용하여 지도를 확대/축소할 수 있는 것은 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;
}
}
}