デバイスの現在の場所とともに、マップビューにいくつかの「興味のある場所」を表示する必要がある Android アプリケーションを開発しています。これはうまくいきます。また、私のアプリでは、ユーザーは「興味のある場所」マーカーを「タップ」でき、アプリケーションはそのマーカーへのルートを描画する必要があります。
Google Directions API を使用してルートを取得し、ポリライン デコーダーを使用してユーザーと場所の間の GeoPoints を取得しました。私のテスト ルートでは、Google は約 200 の異なる GeoPoints を提供してくれます。
したがって、これらのジオポイントを追加するために、次のようなクラスがあります。
public class RouteOverlay extends Overlay {
private GeoPoint gp1;
private GeoPoint gp2;
private int color;
public RouteOverlay(GeoPoint gp1, GeoPoint gp2, int color) {
this.gp1 = gp1;
this.gp2 = gp2;
this.color = color;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Projection projection = mapView.getProjection();
Paint paint = new Paint();
Point point = new Point();
projection.toPixels(gp1, point);
paint.setColor(color);
Point point2 = new Point();
projection.toPixels(gp2, point2);
paint.setStrokeWidth(5);
paint.setAlpha(120);
canvas.drawLine(point.x, point.y, point2.x, point2.y, paint);
super.draw(canvas, mapView, shadow);
}
}
ルートを描画するために行うことは次のとおりです。1) マップ内のマーカーへの onClick イベントを検出します。2) そのイベントから、Google API を呼び出す新しいスレッドを作成します。3) 結果が得られたら、GeoPoint リストで解析/変換します。4) 次に、drawPath メソッドを呼び出します。
private void drawPath(List<GeoPoint> geoPoints, int color) {
mapOverlays.clear();
mapOverlays.add(myLocationOverlay);
mapOverlays.add(itemizedoverlay);
for (int i = 1; i < geoPoints.size(); i++) {
mapOverlays.add(new RouteOverlay(geoPoints.get(i - 1), geoPoints.get(i), color));
}
mapView.postInvalidate();
5) 最後に、UI スレッドに戻ります。
このメソッドは、マップ オーバーレイ リスト (mapOverlays) をクリアします。次に、現在の場所と「関心のある場所」のオーバーレイをリストに追加します。最後に、ルート オーバーレイを追加します。
問題は、突然動作が非常に遅くなり、最終的にクラッシュすることです。しかし、LogCat にはメッセージがありません。したがって、30 のオーバーレイ + 1 + ルートの 200 を超えるオーバーレイは、電話で処理するには多すぎると考えました。しかし、私が見たチュートリアルでは、このように...
私が何か間違ったことをした場合、誰かが私に言うことができますか? 前もって感謝します。