在地图上添加图层的时候,用了ItemizedOverlay,绘制自己位置的时候,也用的这个类,发现很麻烦。google地图上显示当前位置,会有一个蓝色的指南针并且还有范围指示,查了API后发现google提供了结构,MyLocationOverlay,可以很轻松定位到当位置,只不过木有蓝色的指南针,变成一个圆点了。
类结构
com.google.android.maps
Class Overlay
java.lang.Object
com.google.android.maps.Overlay
Direct Known Subclasses:
ItemizedOverlay, MyLocationOverlay
要实现绘制自己位置,首先要重写MyLocationOverlay ,根据需要重新对应的方法。实例中重写了onLocationChanged,实现自动定位到当前位置,并把地图居中
package demo.map;
import android.content.Context;
import android.graphics.Point;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
/**
*我的位置
*
*
*/
public class MyLocOverlay extends MyLocationOverlay
{
MapView mapView = null;
public MyLocOverlay(Context context, MapView mapView)
{
super(context, mapView);
this.mapView = mapView;
}
@Override
public synchronized void disableCompass()
{
super.disableCompass();
}
@Override
public synchronized void disableMyLocation()
{
super.disableMyLocation();
}
@Override
protected boolean dispatchTap()
{
Log.v("dispatchTap", "点击了当前位置");
return super.dispatchTap();
}
@Override
public synchronized boolean enableCompass()
{
return super.enableCompass();
}
@Override
public synchronized boolean enableMyLocation()
{
return super.enableMyLocation();
}
@Override
public Location getLastFix()
{
return super.getLastFix();
}
@Override
public GeoPoint getMyLocation()
{
return super.getMyLocation();
}
@Override
public float getOrientation()
{
return super.getOrientation();
}
@Override
public boolean isCompassEnabled()
{
return super.isCompassEnabled();
}
@Override
public boolean isMyLocationEnabled()
{
return super.isMyLocationEnabled();
}
@Override
public synchronized void onLocationChanged(Location location)
{
super.onLocationChanged(location);
double lat = location.getLatitude();
double lon = location.getLongitude();
Log.v("onLocationChanged", "location: "
+"纬度:"+lat
+"经度:"+lon
);
GeoPoint point = new GeoPoint((int)(lat*1E6), (int)(lon*1E6));
mapView.getController().animateTo(point);
}
@Override
public void onProviderDisabled(String provider)
{
super.onProviderDisabled(provider);
Log.v("onProviderDisabled", "provider: "+provider);
}
@Override
public void onProviderEnabled(String provider)
{
super.onProviderEnabled(provider);
Log.v("onProviderEnabled", "provider: "+provider);
}
@Override
public boolean onSnapToItem(int x, int y, Point snapPoint, MapView mapView)
{
return super.onSnapToItem(x, y, snapPoint, mapView);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
super.onStatusChanged(provider, status, extras);
}
@Override
public boolean onTap(GeoPoint p, MapView map)
{
return super.onTap(p, map);
}
@Override
public synchronized boolean runOnFirstFix(Runnable runnable)
{
return super.runOnFirstFix(runnable);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event, MapView mapView)
{
return super.onKeyDown(keyCode, event, mapView);
}
@Override
public boolean onTouchEvent(MotionEvent e, MapView mapView)
{
return super.onTouchEvent(e, mapView);
}
}
测试类
package demo.map;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ZoomControls;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
public class TestMapActivity extends MapActivity implements OnClickListener
{
MapView mv = null;
MapController mapController = null;
MapView.LayoutParams screenLP;
ZoomControls zoomControls = null;
ImageButton imgButton = null;
MyLocOverlay mlo = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mv = (MapView) findViewById(R.id.mapView);
mapController = mv.getController();
mv.setBuiltInZoomControls(true);
mv.setStreetView(true);
mapController.setZoom(21);
//在地图上添加一个定位的按钮
screenLP = new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT,
MapView.LayoutParams.WRAP_CONTENT, 450, 20,
MapView.LayoutParams.RIGHT);
imgButton = new ImageButton(getApplicationContext());
imgButton.setImageResource(R.drawable.dingwei);
imgButton.setOnClickListener(this);
mv.addView(imgButton, screenLP);
init();
}
private void init()
{
mlo = new MyLocOverlay(this, mv);
/*
*
* enableMyLocation() 尝试开启MyLocation功能,并向LocationManager.GPS_PROVIDER
* LocationManager.NETWORK_PROVIDER注册更新。
*/
mlo.enableCompass();// 开启指南针更新功能。
// 将我的我的位置添加到图层
}
@Override
protected boolean isRouteDisplayed()
{
return false;
}
@Override
public void onClick(View v)
{
Log.e("", "onClick");
if (!mlo.isMyLocationEnabled())
{
mlo.enableMyLocation();
mlo.enableCompass();
mv.getOverlays().add(mlo);
}
}
@Override
protected void onPause()
{
super.onPause();
mlo.disableCompass();
mlo.disableMyLocation();
}
@Override
protected void onResume()
{
super.onResume();
}
}
效果图