适用于Android的OsmDroid上的ItemizedOverlay和自定义标记,不再有触摸事件

时间:2012-05-15 09:57:41

标签: android touch marker osmdroid

我正在使用从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());

要显示默认标记而不是我的自定义标记,会发生触摸事件。

那么我做错了什么?一定不一样吗?

3 个答案:

答案 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);