1

私のAndroidアプリでは、ルートb / w current_locationを表示しており、ユーザーは[ルートを検索]ボタンをクリックして劇場の近くを選択していますが、ユーザーが別の劇場を選択すると、新しいルートも表示されますが、古いルートはクリアされません。いくつかの方法で試しましたが、できませんやること。mapOverlays.clear();で試してみました これは私が望まないマップ全体をクリアします。私が試したとしても{mapOverlays.remove(ol1); mapView.postInvalidate();}ルートをクリアしないでください私を助けてください:以下はコードです:

MyOverLay.java

public class MyOverLay extends Overlay 
{ 
    private GeoPoint gp1; 
    private GeoPoint gp2; 
    private int mode=0; 
    Context mContext;

    public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode) 
    { 
        this.gp1 = gp1; 
        this.gp2 = gp2; 
        this.mode = mode; 
    }  
    public int getMode() 
    { 
        return mode; 
    } 

    @Override 
    public boolean draw (Canvas canvas, MapView mapView, boolean shadow, long when) 
    { 
        Projection projection = mapView.getProjection(); 
        Log.d("shadow", ""+shadow);
        if (shadow== false) 
        { 
            Paint paint = new Paint(); 
            paint.setAntiAlias(true); 
            Point point = new Point(); 
            projection.toPixels(gp1, point); 
            if(mode==1) // start point
            { 
                    paint.setColor(Color.BLUE); 
            } 
            else if(mode==2) // mode=2,path 
            { 
                paint.setColor(Color.BLUE); 
                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); 
            } 
            else if(mode==3)   /* mode=3:end */ 
            { 
                /* the last path */ 
                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); 
                /* end point */
            } 
        } 
        return super.draw(canvas, mapView, shadow, when); 
    } 
}

HelloItemizedOverlay.java

public class HelloItemizedOverlay extends ItemizedOverlay<OverlayItem> {
    WebViewDemo viewDemo;
    GeoPoint curret_point;

    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    Context mContext;

   //some methods

    public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
        viewDemo=(WebViewDemo)context;
    }

    //When user taps theater icon this alert box pop ups.which contains 'Get directions' Button
    @Override
    protected boolean onTap(int index) { 
         WebViewDemo.MyOverLayItem item = (WebViewDemo.MyOverLayItem) mOverlays.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        viewDemo.desc_lat=item.getPoint().getLatitudeE6();
        viewDemo.desc_lng=item.getPoint().getLongitudeE6();
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.setPositiveButton("Get directions", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                viewDemo.showDrections();
            }
        });
        dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        dialog.show();
        return true;
    }
}

WebViewDemoマップアクティビティの主要部分:

WebViewDemo.java

public class WebViewDemo extends MapActivity {

public double current_latitude, current_langitude;
Overlay ol1;
MapView mapView;
GeoPoint destGeoPoint;
HttpClient httpClient;
HttpPost postRequest;
HttpResponse response;
BufferedReader reader;
String sResponse, result;
StringBuilder s;
JSONObject jsonObject;
public String lat = null, lng = null;
int desc_lat,desc_lng;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
.....
mapView = (MapView) findViewById(R.id.mapview);
mapOverlays = mapView.getOverlays();
/**Here i am getting current_latitude, current_langitude using Location Manager
and displaying it on map.and making Web Service request to google and displaying near theaters also.*/
..
}//onCreate end

// *For displaying route b/w current location and User selected Theaters when Get directions Button clicked (in HelloItemizedOverlay class). 

public void showDrections() {

        try {
                      //Here i am trying  to clear previous path. 
            if(ol1!=null){
                mapOverlays.remove(ol1);
                mapView.postInvalidate();
                mapView.invalidate();
            }
            double l1 = desc_lat/1E6;
            double l2 = desc_lng/1E6;
            destGeoPoint = new GeoPoint(desc_lat,desc_lng);
            httpClient = new DefaultHttpClient();
            postRequest = new HttpPost(
                    "http://maps.googleapis.com/maps/api/directions/json?origin="
                            + current_latitude
                            + ","
                            + current_langitude
                            + "&destination="
                            + l1
                            + ","
                            + l2
                            + "&sensor=true&optimize=true&alternatives=false");
            response = httpClient.execute(postRequest);
            reader = new BufferedReader(new InputStreamReader(response
                    .getEntity().getContent(), "UTF-8"));// getting response
            sResponse = null;
            s = new StringBuilder();
            while ((sResponse = reader.readLine()) != null) {
                s = s.append(sResponse);
            }
            result = s.toString().trim();
            jsonObject = new JSONObject(result);

            JSONArray jsonRouteArray = jsonObject.getJSONArray("routes");
            JSONObject overview_poly = jsonRouteArray.getJSONObject(0).getJSONObject("overview_polyline");
            String points = overview_poly.getString("points");
            List<GeoPoint> _geopoints = decodePoly(points);
            GeoPoint gp1;
            GeoPoint gp2;
            gp2 = _geopoints.get(0);
            for (int i = 1; i < _geopoints.size(); i++) // the last one  would be crash
            {
                gp1 = gp2;
                gp2 = _geopoints.get(i);
                ol1 = new MyOverLay(gp1, gp2, 2);
                mapOverlays.add(ol1);
            }
            mapView.postInvalidate();
            dialog.cancel();
        } catch (JSONException je) {
            Toast.makeText(this, "Unable to Show The Route", Toast.LENGTH_LONG).show();
            Log.d("showDirectins() JSON ERROR", ""+je);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
private List<GeoPoint> decodePoly(String encoded) {
//this method is used to decode the route points which are coming from web service and convert them into GeoPoints
}

}

必要に応じてコードの変更を提案してください。

4

3 に答える 3

2

マップ内のルートを削除する可能性があります。ルートの作成中にすべてのオーバーレイ参照を 1 つのリストに保存してください。反復リストを削除する場合は、マップビューからすべてのオーバーレイ参照を削除してください。うまくいくことを願っています。

于 2012-05-02T07:14:42.603 に答える
0

もっと簡単にできる方法を見つけました。おそらく少し汚れていますが、私にとってはうまくいきます。

ボタンがクリックされるたびに増加する整数変数を作成します。コードの上に、このコードを追加します

if(iterator>0) {
                int listSize = mapView.getOverlays().size();
                Log.d("listSize",Integer.toString(listSize));
                mapView.getOverlays().remove(listSize-1); 
                iterator=0;
            }

上記のコードは、マップに描かれた最後のパスを削除します。リストなどは必要ありません。お役に立てれば。

于 2012-08-13T07:09:39.157 に答える
0

MyOverLay クラスに関数を追加します。"setPathVisibility(ブール値)"

可視性と呼ばれるプライベート変数にブール値を格納し、描画ロジックを実行する前に、可視性が true かどうかを確認します。

これにより、すべてのオーバーレイ データを失うことなく、ルートのオンとオフを切り替えることができます。

于 2012-05-02T07:19:49.497 に答える