2012-05-15 5 views
2

Я сейчас использую класс, который простирается от Drawable на OsmDroid. И в этом классе я рисую геометрическую форму для каждого автомобиля, который я получаю из Интернета. Я хотел бы добавить слушателя на каждый автомобиль, чтобы дать некоторую информацию, когда мы касаемся автомобиля. С OverlayItem мы можем сделать это:ItemizedOverlay и пользовательский маркер на OsmDroid для Android, больше не касаются события

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

, чтобы показывать маркер по умолчанию вместо моего пользовательского маркера, происходят события касания.

Так что я делаю неправильно? должно быть то же самое?

ответ

2

Это не «правильный» ответ, но, поскольку я столкнулся с подобной проблемой, я прибегал к использованию ОБОИХ дефолтной ничьей и обычаем в одно и то же время. Я просто вызываю super() в конце моего пользовательского метода draw на ItemizedIconOverlay, и мой рисунок и маркер элемента по умолчанию рисуются. Возможно, было бы возможно настроить маркер по умолчанию, чтобы сделать его невидимым (пустой битмап) ... экспериментом. :)

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

    super.draw(canvas, mv, shadow); 
} 
0

tmouse is correct. Если вы переопределение метода ItemizedOverlayWithFocus.draw(), чтобы нарисовать свой автомобиль с холстом, вам нужно добавить:

super.draw(canvas, view, shadow); 

Супер программа установки и использовать Hotspot в OverlayItem, который является (от того, что я могу видеть в источнике), используемый в качестве осязаемой области для жестов.

Однако вы по-прежнему увидите оригинальные маркеры и рисунки на холсте. PLUS, если вы перемещаете свои автомобили, осязаемая область не будет двигаться вместе с ним. (Точка не будет для нового места, на которое вы нарисовали)

Есть только 2 реальных решения.

1) Вы повторно реализуете ItemizedOverlayWithFocus.draw() и ItemizedOverlayWithFocus.onDrawItem() в своем классе ItemizedOverlayWithFocus. (только вы вызовете onDrawItem(), onDrawCar() и вызовите его вместо метода переопределенного draw())

Этого не стоит, если вы не хотите менять смещение отрисовываемого маркера. например У меня есть значок башни, и я хочу, чтобы 10 пикселей снизу были точкой Y, поэтому похоже, что башня стоит на GeoPoint, а не на краю ее.

2) Сначала вы создаете свои собственные маркеры из растрового изображения и устанавливаете его как Drawable Marker в методе OverlayItem.setMarker(). Попробуйте создать аа растрового изображения с помощью Canvas:

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

Тогда попробуйте назначая Bitmap:

overlayItem.setMarker(new BitmapDrawable(bitmap)); 

Не перегружайте дро(), если вы не хотите, чтобы сделать некоторые другие вещи, и если вы обеспечить вам супер .draw(), поэтому маркер и его точка доступа работают с жестами.

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