代码之家  ›  专栏  ›  技术社区  ›  hwrdprkns

自定义我的位置覆盖更新时间

  •  0
  • hwrdprkns  · 技术社区  · 14 年前

    我正在尝试实现 MyLocationOverlay 从谷歌地图类。但是,当我尝试使用自己的locationmanager时——我无法让覆盖图准确地绘制在地图上。我想知道我是否做错了什么。

    我不想调用mylocationOverlay类的super方法(enbalemyLocation),因为该方法请求从locationManager方法进行更新太快,会将我的电池耗尽。

    这是我的代码:

    private class CenterOverlay extends MyLocationOverlay {
    
        private Context mContext;
        private LocationManager mLocManager;
    
        public CenterOverlay(Context context, MapView mapView) {
            super(context, mapView);
            this.mContext = context;
    
        }
    
        @Override
        public void onLocationChanged(Location location) {
            super.onLocationChanged(location);
            try {
                doExternalCenterOverlayTask(location);
            } catch (JSONException e) {
                e.printStackTrace();
                ErrorHandler.serviceException(mContext);
            } catch (IOException e) {
                e.printStackTrace();
                ErrorHandler.IOException(mContext);
            } catch (ServiceException e) {
                e.printStackTrace();
                ErrorHandler.serviceException(mContext);
            }
        }
    
        @Override
        public boolean enableMyLocation() {
            mLocManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
            mLocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 50, this);
            mLocManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 25, this);
    
            return mLocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
                    || mLocManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        }
    
        @Override
        public void disableMyLocation() {
            super.disableMyLocation();
            mLocManager.removeUpdates(this);
        }
    
        @Override
        public void onProviderDisabled(String provider) {
            super.onProviderDisabled(provider);
            ViewAdapter.createStandardAlertDialog(mContext,
                    "Your location provider has been disabled, please re-enable it.");
        }
    
        @Override
        public void onProviderEnabled(String provider) {
            super.onProviderEnabled(provider);
        }
    
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            super.onStatusChanged(provider, status, extras);
            if (status == 0) {
                ViewAdapter.showLongToast(mContext, "Location is not available at this time");
            } else if (status == 1) {
                //Trying to connect
            } else if (status == 2) {
                // Available
            }
    
        }
    
    }
    
    2 回复  |  直到 13 年前
        1
  •  5
  •   hwrdprkns    13 年前

    我已经深入了解了这一点,在谷歌感觉要更新他们的代码之前是不可能做到的。

    相反,我已经创建了自己的类,它为我绘制了位置——可以随时更新。

    代码在这里。

    /**
    * 
    * @author (hwrdprkns)
    * 2010
    *
    */
    public class CenterOverlay extends ItemizedOverlay<OverlayItem> implements LocationListener {
    
    private static final String TAG = "CenterOverlay: ";
    
    private LocationManager mLocationManager;
    
    private long updateTime = 60000;
    
    private static final int updateDistance = 50;
    
    private GeoPoint lastKnownPoint;
    
    private Location lastKnownLocation;
    
    private Drawable centerDrawable;
    
    private Context mContext;
    
    private final List<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    
    private Paint accuracyPaint;
    
    private Point center;
    
    private Point left;
    
    private Drawable drawable;
    
    private int width;
    
    private int height;
    
    // San Francisco
    private final static double[] DEFAULT_LOCATION = {
            37.7749295, -122.4194155
    };
    
    private Runnable firstFixRunnable = null;
    
    private boolean firstFixRun = false;
    
    public CenterOverlay(Drawable defaultMarker, MapView mapView, Context c) {
        super(boundCenter(defaultMarker));
        this.centerDrawable = defaultMarker;
        this.mContext = c;
        mLocationManager = (LocationManager) c.getSystemService(Context.LOCATION_SERVICE);
    
        if (Constants.DEBUG) {
            updateTime = 0;
        } else {
            updateTime = 60000;
        }
    }
    
    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }
    
    private void checkFirstRunnable() {
        if (!firstFixRun && lastKnownLocation != null && firstFixRunnable != null) {
            firstFixRunnable.run();
        }
    }
    
    private OverlayItem createCenterOverlay(GeoPoint point) {
        OverlayItem i = new OverlayItem(point, "Location", null);
        i.setMarker(centerDrawable);
        return i;
    }
    
    private GeoPoint createGeoPoint(Location loc) {
        int lat = (int) (loc.getLatitude() * 1E6);
        int lng = (int) (loc.getLongitude() * 1E6);
        return new GeoPoint(lat, lng);
    }
    
    @Override
    protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
    }
    
    public void disableLocation() {
        mLocationManager.removeUpdates(this);
    }
    
    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        drawMyLocation(canvas, mapView, lastKnownLocation, lastKnownPoint, 0);
    }
    
    protected void drawMyLocation(Canvas canvas, MapView mapView, Location lastFix, GeoPoint myLoc,
            long when) {
    
        accuracyPaint = new Paint();
        accuracyPaint.setAntiAlias(true);
        accuracyPaint.setStrokeWidth(2.0f);
    
        drawable = centerDrawable;
        width = drawable.getIntrinsicWidth();
        height = drawable.getIntrinsicHeight();
        center = new Point();
        left = new Point();
    
        Projection projection = mapView.getProjection();
    
        double latitude = lastFix.getLatitude();
        double longitude = lastFix.getLongitude();
        float accuracy = lastFix.getAccuracy();
    
        float[] result = new float[1];
    
        Location.distanceBetween(latitude, longitude, latitude, longitude + 1, result);
        float longitudeLineDistance = result[0];
    
        GeoPoint leftGeo = new GeoPoint((int) (latitude * 1e6), (int) ((longitude - accuracy
                / longitudeLineDistance) * 1e6));
        projection.toPixels(leftGeo, left);
        projection.toPixels(myLoc, center);
        int radius = center.x - left.x;
    
        accuracyPaint.setColor(0xff6666ff);
        accuracyPaint.setStyle(Style.STROKE);
        canvas.drawCircle(center.x, center.y, radius, accuracyPaint);
    
        accuracyPaint.setColor(0x186666ff);
        accuracyPaint.setStyle(Style.FILL);
        canvas.drawCircle(center.x, center.y, radius, accuracyPaint);
    
        drawable.setBounds(center.x - width / 2, center.y - height / 2, center.x + width / 2,
                center.y + height / 2);
        drawable.draw(canvas);
    }
    
    public void enableMyLocation() {
        for (String s : mLocationManager.getProviders(true)) {
            mLocationManager.requestLocationUpdates(s, updateTime, updateDistance, this);
        }
    
        Location loc = null;
    
        for (String s : mLocationManager.getProviders(true)) {
            loc = mLocationManager.getLastKnownLocation(s);
            if (loc != null) {
                loc.setLatitude(DEFAULT_LOCATION[0]);
                loc.setLongitude(DEFAULT_LOCATION[1]);
                lastKnownLocation = loc;
                lastKnownPoint = createGeoPoint(loc);
                return;
            }
        }
    
        loc = new Location(LocationManager.GPS_PROVIDER);
        loc.setLatitude(DEFAULT_LOCATION[0]);
        loc.setLongitude(DEFAULT_LOCATION[1]);
    
        lastKnownLocation = loc;
        lastKnownPoint = createGeoPoint(loc);
    }
    
    public Location getLastKnownLocation() {
        return lastKnownLocation;
    }
    
    public GeoPoint getLastKnownPoint() {
        return lastKnownPoint;
    }
    
    public void onLocationChanged(Location location) {
        checkFirstRunnable();
        this.lastKnownLocation = location;
        this.lastKnownPoint = createGeoPoint(location);
        replaceOverlay(createCenterOverlay(lastKnownPoint));
    
    }
    
    public void onProviderDisabled(String provider) {
        ViewAdapter.showLongToast(mContext,
                "Your location provider has been disabled -- please reenable it");
    
    }
    
    public void onProviderEnabled(String provider) {
    
    }
    
    public void onStatusChanged(String provider, int status, Bundle extras) {
    
        if (status == LocationProvider.AVAILABLE) {
    
        }
        if (status == LocationProvider.OUT_OF_SERVICE) {
            ViewAdapter.showShortToast(mContext, "Location is temporarily out of service.");
        }
        if (status == LocationProvider.TEMPORARILY_UNAVAILABLE) {
    
        }
    }
    
    private void replaceOverlay(OverlayItem overlay) {
        mOverlays.clear();
        mOverlays.add(overlay);
        populate();
    }
    
    public boolean runOnFirstFix(Runnable runnable) {
    
        if (lastKnownLocation != null) {
            runnable.run();
            return true;
        }
    
        firstFixRunnable = runnable;
        return false;
    
    }
    
    @Override
    public int size() {
        return mOverlays.size();
    }
    
    public void updateLocation() {
    
    }
    

    }

        2
  •  1
  •   Mathias Conradt    14 年前

    您不会在代码的任何地方向mapview添加覆盖。即类似 mapView.getOverlays().add(centerOverlay);

    这通常发生在你发布的班级之外。你能把你活动的其他相关代码贴出来吗?

    btw:类(centeroverlay)与构造函数(taggstrceoverlay)的名称不同…对吗?