android - Porting a Google Maps app to Osmdroid - problem with overlay -


i'm porting google maps based project osmdroid in order use openstreetmaps. port working ok apart adding overlay consists of number of straight lines , text. in both projects add overlay means of timer thread , handler calling redrawoverlay.

in osm project overlay grey square hiding map. if remove call redrawoveraly, osm tiles shown ok. i've reduced overlay code bare minimum of single diagonal line in code samples below. works fine in google app, overlaying map tile. com.google.android.maps.overlay has draw method, osm has ondraw, have in osm version:

   private mapview mv;    private mapoverlay mmapoverlay = null;     private void redrawoverlay() {     gpt = mv.getmapcenter();    if (mmapoverlay == null)       mmapoverlay = new mapoverlay(getapplicationcontext());       list<overlay> listofoverlays = mv.getoverlays();       listofoverlays.clear();       listofoverlays.add(mmapoverlay);       mv.invalidate();    }     public class mapoverlay extends org.osmdroid.views.overlay.overlay {     public mapoverlay(context ctx) {       super(ctx);       // todo auto-generated constructor stub    }        @override       public void ondraw(canvas canvas, mapview mapview) {        paint lp3;       lp3 = new paint();       lp3.setcolor(color.red);       lp3.setantialias(true);       lp3.setstyle(style.stroke);       lp3.setstrokewidth(1);       lp3.settextalign(paint.align.left);       lp3.settextsize(12);       canvas.drawline(10, 10, 150, 150, lp3);    } 

whilst in google maps original have equivalent :

  public class mapoverlay extends com.google.android.maps.overlay {      @override    public boolean draw(canvas canvas, mapview mapview, boolean shadow,    long when) {       super.draw(canvas, mapview, shadow);       paint lp3;       lp3 = new paint();       .....etc. 

redrawoverlay same except instantiation of overlay just:

mmapoverlay = new mapoverlay(); 

all suggestions gratefully received

update question kurtzmarc:

thanks far, see 1 of authors of osmdroid. it's doing far. suppress 'jump , zoom in' on double tap. i'd nothing @ all. think it's hitting bit in source , doing zoominfixing:

private class mapviewdoubleclicklistener implements gesturedetector.ondoubletaplistener {    @override    public boolean ondoubletap(final motionevent e) {    (int = moverlays.size() - 1; >= 0; i--)       if (moverlays.get(i).ondoubletapup(e, mapview.this))          return true;        final geopoint center = getprojection().frompixels(e.getx(), e.gety());       return zoominfixing(center);   } 

it doesn't seem can override it. i'm using 3.0.1 jar , associated javadocs. i'm wondering if mapview's settouchdelegate method help, there no reference in javadocs. have suggestions please?

i'm not sure calling redrawoverlay() from, if @ minimapoverlay see example drawn @ fixed location on screen. in other words, drawing in screen coordinates not in map coordinates.

example:

@override protected void ondraw(final canvas pc, final mapview posmv) {   // calculate half-world size   final rect viewportrect = new rect();   final projection projection = posmv.getprojection();   final int zoomlevel = projection.getzoomlevel();   final int tilezoom = projection.gettilemapzoom();   mworldsize_2 = 1 << (zoomlevel + tilezoom - 1);    // find what's on screen   final boundingboxe6 boundingbox = projection.getboundingbox();   final point upperleft = org.osmdroid.views.util.mercator             .projectgeopoint(boundingbox.getlatnorthe6(), boundingbox.getlonweste6(),             zoomlevel + tilezoom, null);   final point lowerright = org.osmdroid.views.util.mercator      .projectgeopoint(boundingbox.getlatsouthe6(), boundingbox.getloneaste6(), zoomlevel      + tilezoom, null);    // save mercator coordinates of on screen   viewportrect.set(upperleft.x, upperleft.y, lowerright.x, lowerright.y);    // offset osm coordinates   viewportrect.offset(-mworldsize_2, -mworldsize_2);    // draw line 1 corner other   canvas.drawline(viewportrect.left, viewportrect.top, viewportrect.right, viewportrect.bottom); 

from here viewportrect represents upper left lower right of screen. can use draw @ fixed points on screen.

update:

to answer second question - need override ondoubletap in overlay , return "true". returning "true" indicates base class "consumed" event , no further processing should take place. take @ minimap overlay code example:

http://code.google.com/p/osmdroid/source/browse/trunk/osmdroid-android/src/org/osmdroid/views/overlay/minimapoverlay.java

we right in middle of overhauling overlays, of handled little better in near future. example, getoverlays().clear() bug ran has been reported elsewhere , we've since fixed it.


Comments

Popular posts from this blog

javascript - Enclosure Memory Copies -

php - Replacing tags in braces, even nested tags, with regex -