【问题标题】:How to create its own Marker for OverlayItem in OsmDroid如何在 OsmDroid 中为 OverlayItem 创建自己的标记
【发布时间】:2012-12-11 09:07:56
【问题描述】:

我有以下代码:

ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
GeoPoint geoPoint = new GeoPoint(data.getPosition().longitude, data.getPosition().latitude, data.getPosition().altitude);
OverlayItem overlayItem = new OverlayItem(placeName, description, geoPoint);
overlayItem.setMarker(this.getResources().getDrawable(R.drawable.ic_launcher));
items.add(overlayItem);

overlay = new ItemizedOverlayWithFocus<OverlayItem>(this.getApplicationContext(), items,
        new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {

            @Override
            public boolean onItemSingleTapUp(final int index, final OverlayItem item) {
                return true; // We 'handled' this event.
            }

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

mapView.getOverlays().set(0,overlay);
mapView.invalidate();

我想用画布创建自己的标记,目前我使用的是静态图像,但我想用圆圈、线条等创建自己的表单 我认为这是可能的,但我找不到如何让它发挥作用。

任何帮助将不胜感激

【问题讨论】:

  • 我正在与完全相同的问题作斗争(即绘制自定义汽车绘图作为 OSMDroid 标记)。 setMarker() 方法不起作用,我目前正在实施您的解决方案。它对许多汽车有效吗?自从您在 2012 年提出这个问题以来,您是否提出了一些更好的解决方案?
  • 它使用了 20 个标记,但就像您注意到的那样,这是很久以前的事了。但据我记得,它非常顺利。
  • 谢谢。您是否以任何特定方式处理位图调整大小和各种屏幕尺寸?
  • 地图缩放可调,但标记保持相同大小,但能够根据它们的方向旋转。关于屏幕尺寸,我只将此应用程序开发为 7 英寸平板电脑。

标签: android osmdroid overlayitem


【解决方案1】:

我找到了解决部分问题的解决方案。 我创建了一个从 SimpleLocationOverlay 扩展的类,然后我覆盖 draw() 方法并执行我的 canvas.drawLine,drawCircle ... 但是现在我使用了 SimpleLocationOverlay 类型,我不能再使用 ItemizedOverlayWithFocus,所以我的问题是,如何用我现在使用的替换它?

对于那些对我的解决方案感兴趣的人,以及那些想帮助我的人,代码如下所示:

public class MyOverlay extends SimpleLocationOverlay{
private MyCar myCar = new MyCar();
private GeoPoint geoPosition = new GeoPoint(0, 0);
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

public myOverlay(Context ctx) {
    super(ctx);
    // TODO Auto-generated constructor stub
}

public myOverlay(Context ctx, MyCar _myCar) {
    super(ctx);
    this.myCar= _myCar;
    this.paint.setAntiAlias(true);
    ...
}

@Override
public void draw(Canvas c, MapView osmv, boolean shadow) {
    Point mapCenterPoint = new Point();
    osmv.getProjection().toPixels(this.geoPosition, mapCenterPoint);
    c.drawCircle(mapCenterPoint.x, mapCenterPoint.y, 10, this.paint);
}
}

以及我如何在我的活动中使用它:

    ArrayList<MyOverlay> items = new ArrayList<MyOverlay>();
    int i;

    GeoPoint geoPoint = null;
    MyOverlay myOverlay;

    mapView.getOverlays().clear();

    for (i = 0; i < listeCar.size(); i++) {
        geoPoint = new GeoPoint(listeCar.get(i).getPosition().longitude, listeCar.get(i).getPosition().latitude, listeCar.get(i).getPosition().altitude);
        myOverlay= new myOverlay(getApplicationContext(),listeCar.get(i), mapView);
        myOverlay.setLocation(geoPoint);
        myOverlay.draw(new Canvas(), mapView, false);
        items.add(myOverlay);
    }
    mapView.getOverlays().addAll(0, items );
    items.clear();

【讨论】:

  • 除非您包含 super.draw(c, osmv, shadow); 否则该方法不适用于 OnItemGestureListener在您覆盖的 drwa() 方法中。继承的 ItemizedOverlay 类需要调用 onDrawItem() 来更新触摸手势使用的 HotspotPlace。
【解决方案2】:

我的回答有点晚了,但我一直在努力解决使用 osmdroid 的一系列其他问题。如果要使用自己的 Marker,请先在 Bitmap 中使用,然后在 OverlayItem.setMarker() 方法中将其设置为 Drawable Marker。

如果您覆盖 ItemizedIconOverlay.draw() 方法来绘制您自己的标记,您必须更新 ItemizedIconOverlay 的热点逻辑以及任何使用 OnItemGestureListener 的触摸屏手势。

要使用 Canvas 创建位图,请尝试

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

然后尝试分配位图:

overlayItem.setMarker(new BitmapDrawable(bitmap));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多