我正在使用OSMdroid。
我已感谢此帖子Adding Overlay to OSMDROID,以便在特定位置创建重叠静态项目。
现在我想让地图变得更有活力。所以当位置改变时,OverLayItem(标记地图上的特定位置)也将自行更新。
这是我试图做的。地图确实更新,但OverLayItem没有。
代码:
package com.test.overlay;
import java.util.ArrayList;
import org.osmdroid.DefaultResourceProxyImpl;
import org.osmdroid.ResourceProxy;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.ItemizedOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import org.osmdroid.views.util.constants.MapViewConstants;
import android.app.Activity;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
public class SampleWithMinimapItemizedoverlay extends Activity implements
LocationListener, MapViewConstants
{
private MapView mMapView;
private MapController mapController;
private LocationManager mLocMgr;
private ItemizedOverlay<OverlayItem> mMyLocationOverlay;
private ResourceProxy mResourceProxy;
int longtitude = 31987968;
int latitude = 34783155;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
setContentView(R.layout.main);
mMapView = (MapView) this.findViewById(R.id.mapview);
mMapView.setTileSource(TileSourceFactory.MAPNIK);
mMapView.setBuiltInZoomControls(true);
mMapView.setMultiTouchControls(true);
mapController = this.mMapView.getController();
mapController.setZoom(15);
GeoPoint point2 = new GeoPoint(longtitude, latitude); // centre map here
GeoPoint point3 = new GeoPoint(longtitude + 2000, latitude + 2000); // icon
// goes
// here
// 31.987968,34.783155
mapController.setCenter(point2);
mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 100,
this);
ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
// Put overlay icon a little way from map centre
items.add(new OverlayItem("Here", "SampleDescription", point3));
/* OnTapListener for the Markers, shows a simple Toast. */
this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>()
{
@Override
public boolean onItemSingleTapUp(final int index,
final OverlayItem item)
{
Toast.makeText(SampleWithMinimapItemizedoverlay.this,
"Item '" + item.mTitle, Toast.LENGTH_LONG)
.show();
return true; // We 'handled' this event.
}
@Override
public boolean onItemLongPress(final int index,
final OverlayItem item)
{
Toast.makeText(SampleWithMinimapItemizedoverlay.this,
"Item '" + item.mTitle, Toast.LENGTH_LONG)
.show();
return false;
}
}, mResourceProxy);
this.mMapView.getOverlays().add(this.mMyLocationOverlay);
mMapView.invalidate();
}
-------//here I tried to do the change !!!!!!!!!---------------
-- The map location being updated but not the overlayItem.
public void onLocationChanged(Location location)
{
latitude = (int) (location.getLatitude() * 1E6);
longtitude = (int) (location.getLongitude() * 1E6);
Toast.makeText(SampleWithMinimapItemizedoverlay.this,
"Location changed. Lat:" + latitude + " long:" + longtitude ,
Toast.LENGTH_LONG).show();
GeoPoint gpt = new GeoPoint(latitude, longtitude);
mapController.setCenter(gpt);
mMapView.invalidate();
}
@Override
public void onProviderDisabled(String arg0)
{
}
@Override
public void onProviderEnabled(String provider)
{
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}
谢谢,
射线。
答案 0 :(得分:3)
这应该可行
public class SampleWithMinimapItemizedoverlay extends Activity implements
LocationListener, MapViewConstants {
private MapView mMapView;
private MapController mapController;
private LocationManager mLocMgr;
private ItemizedOverlay<OverlayItem> mMyLocationOverlay;
private ResourceProxy mResourceProxy;
int mLongtitude = 31987968;
int mLatitude = 34783155;
ArrayList<OverlayItem> mItems;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
setContentView(R.layout.main);
mMapView = (MapView) this.findViewById(R.id.mapview);
mMapView.setTileSource(TileSourceFactory.MAPNIK);
mMapView.setBuiltInZoomControls(true);
mMapView.setMultiTouchControls(true);
mapController = this.mMapView.getController();
mapController.setZoom(15);
GeoPoint point2 = new GeoPoint(mLongtitude, mLatitude); // centre map here
GeoPoint point3 = new GeoPoint(mLongtitude + 2000, mLatitude + 2000); // icon
// goes
// 31.987968,34.783155
mapController.setCenter(point2);
mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 100,
this);
mItems = new ArrayList<OverlayItem>();
// Put overlay icon a little way from map centre
mItems.add(new OverlayItem("Here", "SampleDescription", point3));
/* OnTapListener for the Markers, shows a simple Toast. */
// REFER TO THE GESTURE LISTEMER BY NAME NOW
this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(mItems,
new Glistener() , mResourceProxy);
this.mMapView.getOverlays().add(this.mMyLocationOverlay);
mMapView.invalidate();
}
//We can't use an anonymous class anymore if we want to change the position
// of the overlays/icons when location changed, give it a name
class Glistener implements OnItemGestureListener<OverlayItem> {
@Override
public boolean onItemLongPress(int index, OverlayItem item) {
Toast.makeText(SampleWithMinimapItemizedoverlay.this, "Item " + item.mTitle,
Toast.LENGTH_LONG).show();
return false;
}
@Override
public boolean onItemSingleTapUp(int index, OverlayItem item) {
Toast.makeText(SampleWithMinimapItemizedoverlay.this, "Item " + item.mTitle,
Toast.LENGTH_LONG).show();
return true; // We 'handled' this event.
}
}
// -------//here I tried to do the change !!!!!!!!!---------------
// -- The map location being updated but not the overlayItem.
public void onLocationChanged(Location location) {
mLatitude = (int) (location.getLatitude() * 1E6);
mLongtitude = (int) (location.getLongitude() * 1E6);
Toast.makeText(SampleWithMinimapItemizedoverlay.this,
"Location changed. Lat:" + mLatitude + " long:" + mLongtitude,
Toast.LENGTH_LONG).show();
GeoPoint gpt = new GeoPoint(mLatitude, mLongtitude);
mapController.setCenter(gpt);
mItems.clear(); // COMMENT OUT THIS LINE IF YOU WANT A NEW ICON FOR EACH CHANGE OF POSITION
mItems.add(new OverlayItem("New", "SampleDescription", gpt));
// Change the overlay
this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(mItems,
new Glistener() , mResourceProxy);
this.mMapView.getOverlays().clear();
this.mMapView.getOverlays().add(this.mMyLocationOverlay);
mMapView.invalidate();
}
@Override
public void onProviderDisabled(String arg0) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
只需评论/取消注释mItems.clear();行数取决于每次更改位置时是否需要新标记。 (图标出现在您移动到的位置)