longgangbai 发表于 2013-1-30 04:07:42

GIS的学习(三十九)针对osmdroid的扩展之MyLocationOverlay

          在许多用地图应用中,在地图第一次加载的时候,可能将用户当前的位置定位的地图的中心,有时候可能有一个定位的功能,那么当点击点位的时候,需要地图的以当前用户所在位置为中心那么就需要重写MyLocationOverlay类实现相关的功能。
 
针对MyLocationOverlay的重写如下:
package com.etrip.osmdroid;import org.osmdroid.util.GeoPoint;import org.osmdroid.views.MapController;import org.osmdroid.views.MapView;import org.osmdroid.views.overlay.MyLocationOverlay;import com.etrip.osmdroid.R;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Point;import android.location.Location;/** * 重写的目的是在于 * 1.让当前的位置位于地图的中心位置 *** 原文: *   http://stackoverflow.com/questions/4175432/mylocationoverlay-change-the-marker *    *   如果想改变当前位置的图标和标记颜色,可以采用以下两种方式实现: *   Step #1: Create a subclass of MyLocationOverlay. *   Step #2: Override drawMyLocation()*    *    *    **/public class CurrentLocationOverlay extends MyLocationOverlay {    private final static int PADDING_ACTIVE_ZOOM   = 50;    private MapController    mc;   private Bitmap         marker;   private Point            currentPoint            = new Point();    private boolean          centerOnCurrentLocation = true;    private int            height;   private int            width;    /**   * By default this CurrentLocationOverlay will center on the current location,* if the currentLocation is near the   * edge, or off the screen. To dynamically enable/disable this,* use {@link #setCenterOnCurrentLocation(boolean)}.   * @param context   * @param mapView   */   public CurrentLocationOverlay(Context context, MapView mapView) {   super(context, mapView);   this.mc = mapView.getController();    this.marker = BitmapFactory.decodeResource(context.getResources(), R.drawable.marker_default);   }    protected void drawMyLocation(Canvas canvas, MapView mapView, Location lastFix, GeoPoint myLocation, long when) {if (this.height == 0) {       this.height = mapView.getHeight();       this.width = mapView.getWidth();    }    mapView.getProjection().toPixels(myLocation, currentPoint); canvas.drawBitmap(marker, currentPoint.x, currentPoint.y - 40, null);   }    @Override   public synchronized void onLocationChanged(Location location) {   super.onLocationChanged(location);    // only move to new position if enabled and we are in an border-areaif (mc != null && centerOnCurrentLocation && inZoomActiveArea(currentPoint)) {mc.animateTo(getMyLocation());setCenterOnCurrentLocation(true);}   }    private boolean inZoomActiveArea(Point currentPoint) {   if ((currentPoint.x > PADDING_ACTIVE_ZOOM && currentPoint.x < width - PADDING_ACTIVE_ZOOM) && (currentPoint.y > PADDING_ACTIVE_ZOOM && currentPoint.y < height - PADDING_ACTIVE_ZOOM)) {       return false;   }   return true;   }    public void setCenterOnCurrentLocation(boolean centerOnCurrentLocation) {   this.centerOnCurrentLocation = centerOnCurrentLocation;   } } 
 
测试代码如下:
package com.etrip.osmdroid;import org.osmdroid.tileprovider.tilesource.TileSourceFactory;import org.osmdroid.util.GeoPoint;import org.osmdroid.views.MapController;import org.osmdroid.views.MapView;import android.app.Activity;import android.os.Bundle;/** **** @author longgangbai */public class MainActivity extends Activity {private MapController mapController;       private MapView mapView;       /** Called when the activity is first created. */      @Override      public void onCreate(final Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         mapView = (MapView) findViewById(R.id.map);         mapView.setTileSource(TileSourceFactory.MAPNIK);            mapView.setBuiltInZoomControls(true);         mapController = mapView.getController();         mapController.setZoom(8);          CurrentLocationOverlay locationOverlay=new CurrentLocationOverlay(this,mapView);      locationOverlay.enableCompass();      locationOverlay.enableFollowLocation();      locationOverlay.enableMyLocation();      //GeoPoint geopoint=new GeoPoint(39.92605, 116.42616);         // mapController.setCenter(locationOverlay.getMyLocation());         mapView.getOverlays().add(locationOverlay);   }   } 

 
 
 
 
页: [1]
查看完整版本: GIS的学习(三十九)针对osmdroid的扩展之MyLocationOverlay