2012-05-02 3 views
0

У меня есть этот метод, чтобы установить текущее булавку местоположение на карте:Android: Текущий размер расположение канцелярской по точности

private void createPushPinOnMap(Canvas canvas, MapView mapView, BOMPushpin pushpin) { 
    Location location = currentBestLocation; 
    float accuracy = location.getAccuracy(); 

    Point pointPts = mapView.getProjection().toPixels(new GeoPoint(pushpin.getLatitude(), 
      pushpin.getLongtitude()), 
      null); 
    Bitmap bmp1 = BitmapFactory.decodeResource(
      context.getResources(), R.drawable.pushpin);    
    canvas.drawBitmap(bmp1, pointPts.x-10, pointPts.y-34, null); 

} 

Но мне нужно изменить этот код, так что размер канцелярской будет каким-то образом равна точности (как в maps.google.com location pushpin).

ответ

0

Почему никто не сказал мне, что андроиды google api имеют класс с именем MyLocation, который делает все.

0

Вот пример кода, который я использую в своем приложении GTL, с небольшой разницей использую круг вместо pushpin. Если точность изменена, вам нужно установить ее в lastAccuracy. GPSSettings.IS_SHOW_ACCURACY_MARKER defalf true.

Вот код

public class AccuracyOverlay extends Overlay { 
    private GeoPoint geoPoint; 
    private boolean isNeedClearCanvas = false; 
    private float lastAccuracy; 

    public void clearCanvas(Canvas canvas) { 
     canvas.drawColor(Color.WHITE); 
    } 

    private void drawAccuracyCircle(Canvas canvas, MapView mapView, GeoPoint geoPoint) { 
      // convert point to pixels 
     Point screenPoint = new Point(); 
     mapView.getProjection().toPixels(geoPoint, screenPoint); 

     Paint circlePaint = new Paint(); 
     circlePaint.setAntiAlias(true); 
     circlePaint.setStrokeWidth(2.0f); 
     circlePaint.setColor(0xff6666ff); 
     circlePaint.setStyle(Paint.Style.FILL_AND_STROKE); 
     circlePaint.setAlpha(64); 

     double lat = geoPoint.getLatitudeE6(); 
     int radius = (int) mapView.getProjection().metersToEquatorPixels(lastAccuracy); 
     canvas.drawCircle(screenPoint.x, screenPoint.y, radius, circlePaint); 

    } 

    public int metersToRadius(double latitude) { 
     return (int) (mapView.getProjection().metersToEquatorPixels(lastAccuracy) * (1/ Math.cos(Math.toRadians(latitude)))); 
    }  

    public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
     if (GPSSettings.IS_SHOW_ACCURACY_MARKER) { 
      if (!shadow && getLastLocation() != null) { 
       geoPoint = getLastLocation(); 
      } 

      if (geoPoint != null) { 
       if (GPSSettings.IS_SHOW_ACCURACY_MARKER && (lastAccuracy > 0)) { 
        drawAccuracyCircle(canvas, mapView, geoPoint); 
       } 
      } 
      if (isNeedClearCanvas) { 
       boolean wasOn = GPSSettings.IS_SHOW_ACCURACY_MARKER; 
       try { 
        try { 
         if (wasOn) 
          GPSSettings.IS_SHOW_ACCURACY_MARKER = false; 
         geoPoint = null; 
         canvas.drawColor(Color.WHITE); 
        } 
        finally { 
         if (wasOn) { 
          GPSSettings.IS_SHOW_ACCURACY_MARKER = true; 
         } 
        } 
       } 
       finally { 
        isNeedClearCanvas = false; 
       } 
      } 
     } 
    } 

    public AccuracyOverlay() { 
     super(); 
    } 


    public void clearMarks() { 
     this.isNeedClearCanvas = true; 
    } 

    public void setLastAccuracy(float lastAccuracy) { 
     this.lastAccuracy = lastAccuracy; 
    } 
} 
Смежные вопросы