2011-06-13 146 views
8

好吧..我有一个简单的活动,给出了用户的GPS位置。我想要做的是围绕GPS位置画一个圆圈。圆圈给出了有关GPS定位精度的想法。例如,如果精度为6米,那么圆的半径将覆盖6米。以下是代码。预先感谢您的帮助:安卓gps位置精度圈

import java.util.List; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Point; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapActivity; 
import com.google.android.maps.MapController; 
import com.google.android.maps.MapView; 
import com.google.android.maps.Overlay; 

public class ShowMap extends MapActivity { 

    private MapController mapController; 
    private MapView mapView; 
    private LocationManager locationManager; 
    private GeoUpdateHandler geoUpdateHandler; 

    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.gps); 
      mapView = (MapView) findViewById(R.id.mapview); 
      mapView.setBuiltInZoomControls(true); 
      mapView.setSatellite(true); 
      mapController = mapView.getController(); 
      mapController.setZoom(14); // Zoom 1 is world view 
      geoUpdateHandler = new GeoUpdateHandler(); 

      locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
      if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
       createGpsDisabledAlert(); 
      } else { 
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 
         0,geoUpdateHandler); 

      } 

     } 
    private void createGpsDisabledAlert() { 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder 
        .setMessage(
          "Your GPS is disabled! Would you like to enable it?") 
        .setCancelable(false).setPositiveButton("Enable GPS", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, int id) { 
            showGpsOptions(); 
           } 
          }); 
      builder.setNegativeButton("Do nothing", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
         } 
        }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
     } 

    private void showGpsOptions() { 
      Intent gpsOptionsIntent = new Intent(
        android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      startActivity(gpsOptionsIntent); 
     } 


    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 


    public class GeoUpdateHandler implements LocationListener { 

     @Override 
     public void onLocationChanged(Location location) { 
      int lat = (int) (location.getLatitude() * 1E6); 
      int lng = (int) (location.getLongitude() * 1E6); 
      GeoPoint point = new GeoPoint(lat, lng); 
      mapController.animateTo(point); // mapController.setCenter(point); 
      MapOverlay mapOverlay = new MapOverlay(); 
       mapOverlay.setPointToDraw(point); 
       List<Overlay> listOfOverlays = mapView.getOverlays(); 
       listOfOverlays.clear(); 
       listOfOverlays.add(mapOverlay); 

     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onProviderEnabled(String provider) { 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
     } 
    } 


    class MapOverlay extends Overlay 
    { 
     private GeoPoint pointToDraw; 

     public void setPointToDraw(GeoPoint point) { 
     pointToDraw = point; 
     } 

     public GeoPoint getPointToDraw() { 
     return pointToDraw; 
     } 

     @Override 
     public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { 
     super.draw(canvas, mapView, shadow);   

     // convert point to pixels 
     Point screenPts = new Point(); 
     mapView.getProjection().toPixels(pointToDraw, screenPts); 

     // add marker 
     Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pen); 
     canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 128, null);  
     return true; 
     } 




    } 
    @Override 
    public void onPause() { 
     super.onPause(); 
     locationManager.removeUpdates(geoUpdateHandler); 
    } 

} 

回答

5

您应该事先创建Paint对象,draw会执行很多,所以请尽量减少分配。

 @Override 
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { 
    super.draw(canvas, mapView, shadow);   

    // convert point to pixels 
    Point screenPts = new Point(); 
    mapView.getProjection().toPixels(pointToDraw, screenPts); 

    // add marker 
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pen); 
    canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 128, null);  
    return true; 

    mPaintBorder = new Paint(); 
    mPaintBorder.setStyle(Paint.Style.STROKE); 
    mPaintBorder.setAntiAlias(true); 
    mPaintBorder.setColor(0xee4D2EFF); 
    mPaintFill = new Paint(); 
    mPaintFill.setStyle(Paint.Style.FILL); 
    mPaintFill.setColor(0x154D2EFF); 

    double lat = pointToDraw.getLatitudeE6(); 
    int radius = (int) mapView.getProjection().metersToEquatorPixels(theGpsAccuracy); 
    /** Draw the boundary of the circle */ 
    canvas.drawCircle(ScreenPts.x, ScreenPts.y, radius, mPaintBorder); 
    /** Fill the circle with semitransparent color */ 
    canvas.drawCircle(ScreenPts.x, ScreenPts.y, radius, mPaintFill); 
    } 
+1

如何获得GPS准确度的值? – Arci 2012-02-07 07:38:54

+1

当GPS监听器返回一个Location对象时,它有一个字段。看看http://developer.android.com/reference/android/location/Location.html – dzsonni 2012-03-10 09:31:01

7

如果您使用GoogleMap对象,则可以添加一个圆来表示像这样的准确性。

  CircleOptions co = new CircleOptions(); 
      co.center(latlngpoint); 
      co.radius(accuracy_in_meters); 
      co.fillColor(fillColor); 
      co.strokeColor(strokeColor); 
      co.strokeWidth(4.0f); 
     map.addCircle(co); 
+0

你好,你怎么删除它? – 2015-09-16 22:15:14

+2

addCircle()方法返回Circle对象,该对象具有remove()方法https://developers.google.com/android/reference/com/google/android/gms/maps/model/Circle.html#remove()@JawadLeWywadi – snayde 2015-09-24 23:00:50

+0

谢谢,我知道了。 – 2015-09-25 03:20:58