2012-04-18 60 views
0
創建自己標記爲OverlayItem

我有以下代碼:如何OsmDroid

ArrayList<OverlayItem> items = new ArrayList<OverlayItem>(); 
GeoPoint geoPoint = new GeoPoint(data.getPosition().longitude, data.getPosition().latitude, data.getPosition().altitude); 
OverlayItem overlayItem = new OverlayItem(placeName, description, geoPoint); 
overlayItem.setMarker(this.getResources().getDrawable(R.drawable.ic_launcher)); 
items.add(overlayItem); 

overlay = new ItemizedOverlayWithFocus<OverlayItem>(this.getApplicationContext(), items, 
     new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() { 

      @Override 
      public boolean onItemSingleTapUp(final int index, final OverlayItem item) { 
       return true; // We 'handled' this event. 
      } 

      @Override 
      public boolean onItemLongPress(final int index, final OverlayItem item) { 
       return false; 
      } 
     }); 

mapView.getOverlays().set(0,overlay); 
mapView.invalidate(); 

而且我想創建自己的帆布標誌,現在,我使用的是靜態圖像,但我想創建我自己的形式與圈子,行,... 我認爲這是可能的,但我無法找到如何使其工作。

任何幫助將不勝感激

+0

我有完全相同的問題戰鬥(即繪製自定義的車可繪製作爲OSMDroid標記)。 'setMarker()'方法不起作用,我正在實現你的解決方案。它對許多汽車有效嗎?自2012年你問這個問題以來,你有沒有想出更好的解決方案? – syntagma 2013-12-13 13:17:28

+0

它使用了20個標記,但是很久以前就像你注意到的那樣。但據我記憶,這很平穩。 – Bibu 2013-12-13 18:02:12

+1

謝謝。你是否以任何特定的方式處理位圖調整大小和各種屏幕大小? – syntagma 2013-12-13 18:39:37

回答

1

我發現,解決我的問題的一部分的解決方案。我創建了一個從SimpleLocationOverlay擴展的類,然後重寫draw()方法並執行我的canvas.drawLine,drawCircle ... 但是現在我使用SimpleLocationOverlay類型,我無法再使用ItemizedOverlayWithFocus,所以我的問題是,如何將其替換爲我現在使用的?

對於那些誰是我的解決方案感興趣,如果誰願意​​幫助我,代碼看起來像這樣:

public class MyOverlay extends SimpleLocationOverlay{ 
private MyCar myCar = new MyCar(); 
private GeoPoint geoPosition = new GeoPoint(0, 0); 
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 

public myOverlay(Context ctx) { 
    super(ctx); 
    // TODO Auto-generated constructor stub 
} 

public myOverlay(Context ctx, MyCar _myCar) { 
    super(ctx); 
    this.myCar= _myCar; 
    this.paint.setAntiAlias(true); 
    ... 
} 

@Override 
public void draw(Canvas c, MapView osmv, boolean shadow) { 
    Point mapCenterPoint = new Point(); 
    osmv.getProjection().toPixels(this.geoPosition, mapCenterPoint); 
    c.drawCircle(mapCenterPoint.x, mapCenterPoint.y, 10, this.paint); 
} 
} 

我如何使用它在我的活動:

ArrayList<MyOverlay> items = new ArrayList<MyOverlay>(); 
    int i; 

    GeoPoint geoPoint = null; 
    MyOverlay myOverlay; 

    mapView.getOverlays().clear(); 

    for (i = 0; i < listeCar.size(); i++) { 
     geoPoint = new GeoPoint(listeCar.get(i).getPosition().longitude, listeCar.get(i).getPosition().latitude, listeCar.get(i).getPosition().altitude); 
     myOverlay= new myOverlay(getApplicationContext(),listeCar.get(i), mapView); 
     myOverlay.setLocation(geoPoint); 
     myOverlay.draw(new Canvas(), mapView, false); 
     items.add(myOverlay); 
    } 
    mapView.getOverlays().addAll(0, items); 
    items.clear(); 
+0

這種方法不會與OnItemGestureListener一起使用,除非在您的重寫的drwa()方法中包含super.draw(c,osmv,shadow);繼承的ItemizedOverlay類需要調用onDrawItem()來更新觸摸手勢可以使用的HotspotPlace。 – garlicman 2012-12-11 00:59:42

0

我的答案有點晚,但我一直在使用osmdroid解決這一系列其他問題。如果您想使用自己的標記,首先在Bitmap中執行此操作,然後將其設置爲OverlayItem.setMarker()方法中的Drawable Marker。

如果您重寫用於繪製自己標記的ItemizedIconOverlay.draw()方法,則必須更新ItemizedIconOverlay的Hotspot邏輯以及使用OnItemGestureListener的任何觸摸屏手勢。

若要使用Canvas位圖,嘗試

Bitmap bitmap = Bitmap.createBitmap(width, height, Config.RGB_565); 
Canvas canvas = new Canvas(bitmap); 
// Draw on your canvas... 

然後嘗試分配位圖:

overlayItem.setMarker(new BitmapDrawable(bitmap));