andriod map开发5 绘制当前位置
2012-05-31 14:41
197 查看
在地图上添加图层的时候,用了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();
}
}
效果图
类结构
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();
}
}
效果图
相关文章推荐
- iOS 开发 如何获得用户当前位置(通过经纬度获得城市、省份等信息)
- WinAPI: PolylineTo - 绘制一组连续线段(更新当前位置)
- (android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图
- iOS开发笔记(使用Google Map Service获取用户当前位置信息)
- iOS开发,定位当前所在地理位置偏移,坐标转换
- 在iOS开发中自动获取当前的位置(GPS定位)
- Android GIS开发系列-- 入门季(9) 定位当前的位置
- (android地图开发) 基于百度Lbs服务定位用户的当前位置
- iOS基于百度地图的开发(1)——用户当前位置
- 微信小程序开发之真机测试 地图定位 map API 无法获取当前位置的问题
- Skyline二次开发中同一位置的绘制顺序问题
- (android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图
- 【微信开发】-HTML5页面直接调用百度地图API,获取当前位置,直接导航目的地
- Android百度地图开发 百度地图得到当前位置
- IOS应用开发中的tips - MKMapView之设置地图以用户当前位置为中心
- iOS开发问题:系统提示框是否同意获取当前位置提示框自动消失问题
- 【微信开发】-HTML5页面直接调用百度地图API,获取当前位置,直接导航目的地
- iOS开发中自动获取当前位置(GPS定位)
- Android开发之GPS获取当前位置信息
- Windows Store apps开发[15]如何获取设备当前位置