2012-07-31 2 views
2

Я хочу создать такую ​​функциональность, как Google Maps. Я хочу обновить свой маркер местоположения всякий раз, когда человек начинает ходить/водить. Я думаю использовать метод onLocationChange для LocationListner, но я не уверен. Мне также нравится рисовать путь с обновлением местоположения на Картах Google.Обновить местоположение Маркер и рисовать маршрут на Картах Google при ходьбе/вождении в Android

Все предложения приветствуются.

ItemizedOverlay: -

public class LocationOverlay extends ItemizedOverlay<OverlayItem>{ 

    private List<OverlayItem> myOverlays; 
    Path path; 
    static int cnt = -1; 
    public LocationOverlay(Drawable defaultMarker) { 
     super(boundCenterBottom(defaultMarker)); 
     System.out.println("Normal..."); 
     myOverlays = new ArrayList<OverlayItem>(); 
    } 


    public void addOverlay(OverlayItem overlay) { 
     System.out.println("Add Overlay called"); 
     myOverlays.add(overlay); 
     populate(); 
      cnt++; 
    } 

    @Override 
    protected OverlayItem createItem(int i) { 
     return myOverlays.get(i); 
    } 

    public void removeItem(int i) { 
     myOverlays.remove(i); 
     populate(); 
    } 

    @Override 
    public int size() { 
     return myOverlays.size(); 
    } 

    @Override 
    public void draw(Canvas canvas, final MapView mapView, boolean shadow) { 


      if (shadow) { 
      paint.setDither(true); 
      paint.setColor(Color.RED); 
      paint.setStyle(Paint.Style.STROKE); 
      paint.setStrokeJoin(Paint.Join.ROUND); 
      paint.setStrokeCap(Paint.Cap.ROUND); 
      paint.setStrokeWidth(4); 

      path = new Path(); 
      Point point1 = new Point(); 
      Projection projection = mapView.getProjection(); 
      if (myOverlays.size() > 1) { 

       System.out.println(">>>>>>>>>>>"); 

       for (int i = 0, j=i; i < myOverlays.size(); i++) { 
       Point point1 = new Point(); 
       Point point2 = new Point(); 
       projection.toPixels(myOverlays.get(i).getPoint(), point1); 

       System.out.println(">>>>>>>>>>>"); 

       projection.toPixels(myOverlays.get(j++).getPoint(), point2); 
       System.out.println("Point == " + j); 

       path.moveTo(point2.x, point2.y); 
       path.lineTo(point1.x, point1.y); 
       canvas.drawPath(path, paint); 
       super.draw(canvas, mapView, shadow); 
      } 
      } 
     } 
     canvas.drawPath(path, paint); 
     super.draw(canvas, mapView, shadow); 
    } 
} 

Примечание - метод рисования вызывается множественным время для одного LocationChanged.

EDIT: -

Я могу нарисовать маршрут, когда есть любое место изменился огнь события, но я столкнулся с небольшой проблемой там. Его также тянет путь от корня каждый раз. Я хочу, чтобы с последнего места он должен начать рисовать путь (например, соединение от последнего к следующему местоположению). Я использую одно изображение для лучшего понимания.

enter image description here

Из образа вы можете увидеть, что начальная точка также соединена с последней точкой. Я не хочу этого. Любая идея по этому поводу.

ответ

2

Текущее местоположение может быть легко нарисовано с помощью MyLocationOverlay. Что вам нужно сделать - это добавить этот оверлей к вашему MapView. Что-то вроде:

mapView.addOverlay(new MyLocationOverlay(context, mapView)); 

расположения точек по умолчанию будет автоматически рисуются и будут обновляться, как только вы перемещаете

С маршрутом это немного сложнее, но все еще нет ракетостроения там. Что вам нужно сделать - это расширить класс Overlay и реализовать логику draw(). Вам необходимо отслеживать GeoPoints, в котором вы путешествовали, и проецировать их на карту (в вашем draw() вашего оверлея вы можете запросить свой mapView для экземпляра Projection - getProjection(). Вы можете использовать этот прогноз для сопоставления геотонов с координатами вашей карты). Как только у вас есть список GeoPoints - вы можете создать Path и сделать этот путь на холсте

Упрощенный пример, как рисовать путь на карте (есть некоторые пользовательские классы, которые я использую в моем проекте, но вы должен получить представление):

Path path; 

@Override 
public void draw(Canvas canvas, final MapView mapView, boolean shadow) 
{ 
    Projection proj = mapView.getProjection(); 
    updatePath(mapView,proj); 
    canvas.drawPath(path, mPaint); 
} 

protected void updatePath(final MapView mapView, Projection proj) 
{ 
    path = new Path(); 

    proj.toPixels(mPoints.get(0).point, p); 
    path.moveTo(p.x, p.y); 

    for(RouteEntity.RoutePoint rp : mPoints) 
    { 
     proj.toPixels(rp.point, mPoint); 
     path.lineTo(mPoint.x, mPoint.y); 
    } 
} 
+0

Точка местоположения по умолчанию будет нарисована автоматически и будет обновлена, как только вы перейдете бу как она будет обновлена? Я знаю, что, реализуя LocationListner, это делается, но я хочу знать, как его обновление? Это основано на requestUpdateLocation LocationManager? А во время обновления его обращение к методу onLocationChange прямо? – Scorpion

+0

внутренне - да. Он использует GPS или сеть для получения последнего известного местоположения и при обновлении местоположения - onLocationChanged срабатывает обратный вызов –

+0

Хорошо. Спасибо за сообщение. Я попробую это ... – Scorpion