我正在使用从OsmDroid上的Drawable扩展的类。 在这个课程中,我为从互联网上收到的每辆车画一个几何形状。 我想在每辆车上添加一个听众,以便在我们触摸汽车时提供一些信息。 使用OverlayItem,我们可以这样做:
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());
要显示默认标记而不是我的自定义标记,会发生触摸事件。
那么我做错了什么?一定不一样吗?
答案 0 :(得分:2)
这不是一个适当的&#39;回答但是当我面临类似的问题时,我同时使用BOTH默认绘图和自定义。 我只是在ItemizedIconOverlay上的自定义绘制方法结束时调用super(),并且我的绘图和&#39;默认&#39;项目标记被绘制。 也许有可能调整默认标记使其不可见(空位图)...实验。 :)
@Override
public void draw(Canvas canvas, MapView mv, boolean shadow) {
if(!shadow) {
//my draw code
}
super.draw(canvas, mv, shadow);
}
答案 1 :(得分:0)
tmouse是对的。如果您要覆盖ItemizedOverlayWithFocus.draw()方法以使用画布绘制汽车,则需要添加:
super.draw(canvas, view, shadow);
super将设置并使用OverlayItem的Hotspot(来自我在源中可以看到的)用作手势的可触摸区域。
然而,你仍会看到原始的标记和画布的画布。如果您移动汽车,可触摸区域将无法移动。 (Hotspot不适用于您所在的新位置)
只有两个真正的解决方案。
1)您在自己的ItemizedOverlayWithFocus类中重新实现ItemizedOverlayWithFocus.draw()和ItemizedOverlayWithFocus.onDrawItem()。 (只有你将调用onDrawItem(),onDrawCar(),并从重写的draw()方法调用它)
除非您想要更改正在绘制的标记的偏移量,否则这是不值得的。例如我有一个塔形图标,我希望从底部10个像素成为Y点,所以它看起来像塔站在GeoPoint上,而不是在它的边缘。
2)首先从位图创建自己的标记,然后在OverlayItem.setMarker()方法中将其设置为可绘制标记。尝试使用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(),如果你确实想要super.draw(),那么Marker及其Hotspot就可以使用手势。
答案 2 :(得分: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);