2012-05-15 18 views
2

我正在使用從OsmDroid的Drawable延伸的類。 而在這堂課上,我爲從互聯網接收到的每輛車繪製了幾何形狀。 我想在每輛車上增加一名聽衆,以便在我們觸摸車輛時提供一些信息。 隨着OverlayItem我們可以這樣做:Android上的OsmDroid的ItemizedOverlay和自定義標記,沒有更多的觸摸事件

ArrayList<OverlayItem> items = new ArrayList<OverlayItem>(); 
carOverlay.draw(new Canvas()); 
overlayItem = new OverlayItem("test", ""+i, geoPoint); 
overlayItem.setMarker(carOverlay.getCurrent()); 
items.add(overlayItem); 
ItemizedOverlay<OverlayItem> overlay = new ItemizedOverlayWithFocus<OverlayItem>(this.getApplicationContext(), items, 
     new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() { 

      @Override 
      public boolean onItemSingleTapUp(final int index, final OverlayItem item) { 
       Log.i("Touch","you just tap the car"); 
       return true; 
      } 

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

     }); 

有了這一段代碼,我可以看到我剛剛繪製的圖像,但任何情況下,當我碰了一輛車,如果我刪除行:

overlayItem.setMarker(carOverlay.getCurrent()); 

要讓默認標記被顯示而不是我的自定義標記,則會發生觸摸事件。

那麼我做錯了什麼?必須是一樣的否?

回答

2

這不是一個'正確'的答案,但由於我面臨類似的問題,我訴諸於同時使用兩者的默認繪製和自定義。 我只是在ItemizedIconOverlay上的自定義繪製方法的末尾調用super(),並繪製了我的繪圖和「默認」項目標記。 也許它可以調整默認標記,使其不可見(空位圖)...實驗。 :)

@Override 
public void draw(Canvas canvas, MapView mv, boolean shadow) { 
    if(!shadow) { 
    //my draw code 
     } 

    super.draw(canvas, mv, shadow); 
} 
0

tmouse是正確的。如果你重寫ItemizedOverlayWithFocus.draw()方法來繪製畫布你的車,你需要添加:

super.draw(canvas, view, shadow); 

超級意願設置和使用OverlayItem的熱點是(從我所看到的在源中)用作手勢的可觸摸區域。

但是,您仍然會看到原始標記和您的畫布繪製的標記。加上如果你移動你的汽車,可觸摸區域將不會隨之移動。 (熱點將不會適用於您繪製的新位置)

只有2個真正的解決方案。

1)您在您自己的ItemizedOverlayWithFocus類中重新實現了ItemizedOverlayWithFocus.draw()和ItemizedOverlayWithFocus.onDrawItem()。 (只有你會調用onDrawItem(),onDrawCar(),並從覆蓋的draw()方法中調用它)

這是不值得的,除非你想改變被繪製的標記的偏移量。例如我有一個塔形圖標,我想從底部算起10個像素爲Y點,所以它看起來像塔站在GeoPoint上,而不是它的邊緣。

2)首先從位圖創建自己的標記,並將其設置爲OverlayItem.setMarker()方法中的Drawable Marker。嘗試創建AA位圖使用Canvas:

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

然後嘗試分配位圖:

overlayItem.setMarker(new BitmapDrawable(bitmap)); 

不覆蓋的draw(),除非你想畫一些其他的東西,如果你保證讓您超.draw(),所以標記和它的熱點與手勢一起工作。

0

你也可以試試這個代碼

Drawable newMarker = this.getResources().getDrawable(R.drawable.ic_marker); 

this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items, 
      newMarker, "listener try null", new DefaultResourceProxyImpl(getActivity())); 

mapView.getOverlays().add(mMyLocationOverlay); 
相關問題