Android:根据准确性,当前位置图钉大小

时间:2012-05-02 08:16:55

标签: java android google-maps pushpin currentlocation

我有这种方法在地图上设置当前位置图钉:

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位置图钉中)。

2 个答案:

答案 0 :(得分:0)

为什么没有人告诉我,机器人谷歌api有一个名为MyLocation的类,它可以创造一切。

答案 1 :(得分:0)

以下是我在GTL应用程序中使用的示例代码,略有不同,我使用circle而不是pushpin。如果准确性已更改,则需要在lastAccuracy中进行设置。 GPSSettings.IS_SHOW_ACCURACY_MARKER是真实的。

这是代码

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;
    }
}