Android-оверлеи Перезапись / удаление других - PullRequest
3 голосов
/ 11 июля 2011

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

Что я могу сделать, это показатьтекущее местоположение пользователей и все возможные пункты назначения, которые они могут захотеть посетить. Проблема заключается в том, что моя базовая реализация показа маршрута. То, что я сделал до сих пор, - это получение маршрута из 2 статических местоположений (в конечном итоге я изменю его на местоположение пользователей).и статическое местоположение, но для тестирования, оно имеет значение 2 статического), однако, когда этот маршрут отображается, наложение «Другое» текущей позиции и маркеры исчезают.

Вот мои java-файлы, любая помощь будет оценена

MapViewActivity

public class MapViewActivity extends MapActivity implements LocationListener {

 private static final String TAG = null;
  LocationManager locman;
  Location loc;
  private MapView map;
  private MapController controller;
  public MapOverLay MyOverlay;
  MyLocationOverlay overlay;
  LinearLayout linearLayout;
  MapView mapView;
  private Road mRoad;

    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            mapView = (MapView) findViewById(R.id.mapview);
            mapView.setBuiltInZoomControls(true);
            initMapView();
            initMyLocation();
            //route();
            /* *********************
             * There seems to be a problem in here that when route() is run
             * the HelloItemizedArray disappears and the route from the 2 static locations
             * is shown , While this wouldn't be so bad for the application as there's no need
             * to show any other stations when the user has picked one ... the problem is that the
             * marker for the current location disappears or the user might need to pick a different station
             * and i would like them to be able to do so without having to do the onCreate() again.
             * **********************
             */

            }


    private void initMapView() {
        map = (MapView) findViewById(R.id.mapview);
        controller = map.getController();
        map.setSatellite(false);
        map.setBuiltInZoomControls(true);
        List<Overlay> mapOverlays = map.getOverlays();
        Drawable drawable = this.getResources().getDrawable(R.drawable.icon);
        HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable,this);
        GeoPoint point = new GeoPoint((int)(53.34675984552593 * 1E6), (int)(-6.258945465087891 * 1E6));
       // O'Conell Bridge
        OverlayItem overlayitem = new OverlayItem(point, "O'Connell Bridge", "");
       GeoPoint point2 = new GeoPoint((int)(53.33842 * 1E6), (int)(-6.25365 * 1E6));
       //53.33842; -6.25365 -- Stephens green
       OverlayItem overlayitem2 = new OverlayItem(point2, "Stephens green", "");

        itemizedoverlay.addOverlay(overlayitem);
        itemizedoverlay.addOverlay(overlayitem2);
        mapOverlays.add(itemizedoverlay);

     }
    private void initMyLocation() {
        final MyLocationOverlay overlay = new MyLocationOverlay(this, map);
        overlay.enableMyLocation();
        overlay.enableCompass(); // does not work in emulator
        overlay.runOnFirstFix(new Runnable() {
           public void run() {
              // Zoom in to current location
              controller.setZoom(15);
              controller.animateTo(overlay.getMyLocation());
           }
        });
        map.getOverlays().add(overlay);
     }

    public void route() {
        double fromLat = 53.34675984552593, fromLon = -6.258945465087891, toLat = 53.33842, toLon = -6.25365;
String url = RoadProvider
                            .getUrl(fromLat, fromLon, toLat, toLon);
            InputStream is = getConnection(url);
            mRoad = RoadProvider.getRoute(is);
            mHandler.sendEmptyMessage(0);
    }

    Handler mHandler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                    TextView textView = (TextView) findViewById(R.id.description);
                    textView.setText(mRoad.mName + " " + mRoad.mDescription);
                    MapOverLay mapOverlay = new MapOverLay(mRoad, mapView);
                    List<Overlay> listOfOverlays = mapView.getOverlays();
                    listOfOverlays.clear();
                    listOfOverlays.add(mapOverlay);
                    mapView.invalidate();
            };
    };

    private InputStream getConnection(String url) {
            InputStream is = null;
            try {
                    URLConnection conn = new URL(url).openConnection();
                    is = conn.getInputStream();
            } catch (MalformedURLException e) {
                    e.printStackTrace();
            } catch (IOException e) {
                    e.printStackTrace();
            }
            return is;
    }

    @Override
    protected boolean isRouteDisplayed() {
            return false;
    }


    public void onLocationChanged(Location location) {
        controller.animateTo(overlay.getMyLocation());          
    }


    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }


    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }


    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }
}

HelloItemizedOverlay.java

public class HelloItemizedOverlay extends ItemizedOverlay<OverlayItem>
{
 private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
 private Context mContext;

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

 public void addOverlay(OverlayItem overlay)
 {
  mOverlays.add(overlay);
  populate();
 }
 @Override
 protected OverlayItem createItem(int i)
 {
 return mOverlays.get(i);
 }
 @Override
 public int size()
 {
 return mOverlays.size();
 }
 @Override
 protected boolean onTap(int index)
 {
 OverlayItem item = mOverlays.get(index);
 AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
 dialog.setTitle(item.getTitle());
 dialog.setIcon(R.drawable.petrol);
 dialog.setMessage(item.getSnippet());
 dialog.setPositiveButton("Ok", new AlertDialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
    // Implement the route to this location from this LISTENER
}
 });

 dialog.setNegativeButton("cancel", null);
 dialog.show();
 return true;
 }
}

MapOverLay.java

class MapOverLay extends com.google.android.maps.Overlay {
Road mRoad;
ArrayList<GeoPoint> mPoints;

public MapOverLay(Road road, MapView mv) {
        mRoad = road;
        if (road.mRoute.length > 0) {
                mPoints = new ArrayList<GeoPoint>();
                for (int i = 0; i < road.mRoute.length; i++) {
                        mPoints.add(new GeoPoint((int) (road.mRoute[i][1] * 1000000),
                                        (int) (road.mRoute[i][0] * 1000000)));
                }
                int moveToLat = (mPoints.get(0).getLatitudeE6() + (mPoints.get(
                                mPoints.size() - 1).getLatitudeE6() - mPoints.get(0)
                                .getLatitudeE6()) / 2);
                int moveToLong = (mPoints.get(0).getLongitudeE6() + (mPoints.get(
                                mPoints.size() - 1).getLongitudeE6() - mPoints.get(0)
                                .getLongitudeE6()) / 2);
                GeoPoint moveTo = new GeoPoint(moveToLat, moveToLong);

                MapController mapController = mv.getController();
                mapController.animateTo(moveTo);
                mapController.setZoom(15);
        }
}

@Override
public boolean draw(Canvas canvas, MapView mv, boolean shadow, long when) {
        super.draw(canvas, mv, shadow);
        drawPath(mv, canvas);
        return true;
}

public void drawPath(MapView mv, Canvas canvas) {
        int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
        Paint paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(3);
        for (int i = 0; i < mPoints.size(); i++) {
                Point point = new Point();
                mv.getProjection().toPixels(mPoints.get(i), point);
                x2 = point.x;
                y2 = point.y;
                if (i > 0) {
                        canvas.drawLine(x1, y1, x2, y2, paint);
                }
                x1 = x2;
                y1 = y2;
        }
}

}

Любые советы или советы помогутБуду искренне признателен, спасибо.

1 Ответ

2 голосов
/ 13 июля 2011

Извините, обнаружил мою ошибку в коде, который я использовал listOfOverlays.clear ();

Слишком рано в моем коде это не подразумевается, пока пользователь не подтвердит, что он хочет туда (для дальнейшего использования в приложении) Просто подумал, что отвечу на случай, если другие захотят использовать код и возникнут схожие проблемы

...