在我的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 Map Activity的主要部分:
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
}
}
如果需要,请建议我更改代码。
答案 0 :(得分:2)
有可能在地图中删除路线,请在创建路线时将所有叠加参考存储到一个列表,当您要删除迭代列表时,从地图视图中删除所有叠加参考。我希望它能奏效。
答案 1 :(得分:0)
向MyOverLay类添加一个函数。 “setPathVisibility(布尔型)”
将bool存储在名为visibility的私有变量中,在执行任何绘制逻辑之前,检查可见性是否为真。
这将允许您在不丢失所有叠加数据的情况下打开和关闭路线。
答案 2 :(得分:0)
我找到了一种更简单的方法。它可能有点脏,但它对我有用。
创建一个整数变量,只要单击按钮,该变量就会增加。 然后在代码之上添加此代码
if(iterator>0) {
int listSize = mapView.getOverlays().size();
Log.d("listSize",Integer.toString(listSize));
mapView.getOverlays().remove(listSize-1);
iterator=0;
}
上面的代码将删除地图上绘制的最后一条路径。不需要列表或类似的东西。希望这会有所帮助。