3

Google マップのような機能を作成したいと考えています。人が歩いたり運転したりするたびに、自分の位置マーカーを更新したいと考えています。LocationListner の onLocationChange メソッドを使用することを考えていますが、よくわかりません。また、Google マップで場所を更新しながら道を描くのも好きです。

すべての提案は大歓迎です。

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

注 - draw メソッドは、単一の locationChanged に対して複数回呼び出されます。

編集 :-

場所が変更されたイベント火災があるときはいつでもルートを描くことができますが、小さな問題に直面しています。また、毎回ルートからパスを描画します。最後の場所からパスの描画を開始する必要があります(つまり、最後の場所から次の場所に接続します)。理解を深めるために画像を1枚添付します。

ここに画像の説明を入力

画像から、開始点も最後の点に接続されていることがわかります。私はこれをしたくありません。これに関する任意のアイデア。

4

1 に答える 1

2

現在地はMyLocationOverlayで簡単に描画できます。あなたがする必要があるのは、このオーバーレイを MapView に追加することです。何かのようなもの:

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

デフォルトの位置ドットは自動的に描画され、移動するとすぐに更新されます

ルートでは少しトリッキーですが、それでもそこにはロケット科学はありません. あなたがする必要があるのは、Overlay クラスを拡張してdraw()ロジックを実装することです。移動した GeoPoints を追跡し、それらを地図上に投影する必要があります (オーバーレイではdraw()、mapView にProjectionインスタンスを要求できます - getProjection()。この投影法を使用して、GeoPoints を地図座標にマッピングできます)。ジオポイントのリストを取得したらすぐに、パスを作成し、このパスをキャンバスに描画できます

マップ上にパスを描画する方法の簡単な例 (私のプロジェクトで使用するカスタム クラスがいくつかありますが、アイデアが得られるはずです):

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);
    }
}
于 2012-07-31T17:59:19.400 に答える