0

我有以下代码:

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

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

任何帮助将不胜感激

4

2 回答 2

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();
于 2012-04-19T14:58:18.603 回答
0

我的回答有点晚了,但我一直在努力解决使用 osmdroid 的一系列其他问题。如果要使用自己的标记,请先在位图中执行此操作,然后在 OverlayItem.setMarker() 方法中将其设置为可绘制标记。

如果您覆盖 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));
于 2012-12-11T01:07:56.807 回答