2

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

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

那么我做错了什么?一定是一样的吧?

4

3 回答 3

2

这不是一个“正确”的答案,但由于我面临类似的问题,我同时使用了默认绘图和自定义。我只是在 ItemizedIconOverlay 上的自定义绘制方法结束时调用 super() 并且绘制了我的绘图和“默认”项目标记。也许可以调整默认标记以使其不可见(空位图)......实验。:)

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

    super.draw(canvas, mv, shadow);
}
于 2012-10-10T14:50:01.093 回答
0

鼠标是正确的。如果您要覆盖 ItemizedOverlayWithFocus.draw() 方法以使用画布绘制汽车,则需要添加:

super.draw(canvas, view, shadow);

超级将设置并使用 OverlayItem 的热点(从我在源代码中可以看到)用作手势的可触摸区域。

但是,您仍然会看到原始标记和画布绘制的标记。另外,如果您移动汽车,可触摸区域将不会随之移动。(热点不会出现在您绘制的新位置)

只有两个真正的解决方案。

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() 以便标记和它的热点与手势一起工作。

于 2012-12-11T01:23:19.843 回答
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);
于 2013-03-26T03:17:55.897 回答