【问题标题】:ItemizedOverlay and custom marker on OsmDroid for Android, no more touch eventOsmDroid for Android 上的 ItemizedOverlay 和自定义标记,不再有触摸事件
【发布时间】:2012-05-15 09:57:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: android touch marker osmdroid


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      super.draw(canvas, view, shadow);
      

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

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

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

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

      【讨论】:

        【解决方案3】:

        你也可以试试这个代码

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多