2012-05-24 13 views
5

He creado un marcador dibujable personalizado que utiliza lienzo para dibujar límites. Todo funciona bien excepto una cosa: onItemSingleTapUp no se llama cuando se graba cualquier marcador en la pantalla. Aquí es ajuste de código de la creación:Osmdroid. onItemSingleTapUp no funciona para Drawable personalizado

ItemizedIconOverlay<OverlayItem> groupsOverlay = new ItemizedIconOverlay<OverlayItem>(
    new ArrayList<OverlayItem>(), 
    new OnItemGestureListener<OverlayItem>() { 

     @Override 
     public boolean onItemLongPress(int arg0, OverlayItem arg1) {         
      return false; 
     } 

     @Override 
     public boolean onItemSingleTapUp(int arg0, OverlayItem arg1) { 

      if(arg1 == null){ 
       return false; 
      } 

      if(m_prevView != null){ 
       m_mapView.removeView(m_prevView); 
       m_prevView = null; 
      } 

      View popUp = getLayoutInflater().inflate(R.layout.map_popup, m_mapView, false); 
      TextView tv = (TextView)popUp.findViewById(R.id.popupTextView); 
      tv.setText(arg1.getTitle()); 

      MapView.LayoutParams mapParams = new MapView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
     ViewGroup.LayoutParams.WRAP_CONTENT, 
     arg1.getPoint(), 
     MapView.LayoutParams.BOTTOM_CENTER, 0, 0); 
      m_mapView.addView(popUp, mapParams); 
      m_prevView = popUp; 

      return true; 
     } 
    }, new DefaultResourceProxyImpl(getApplicationContext())); 

Ésta es costumbre marcador dibujable:

package com.testapp.data; 
import android.graphics.Canvas; 
import android.graphics.ColorFilter; 
import android.graphics.Paint; 
import android.graphics.Paint.Align; 
import android.graphics.Paint.Style; 
import android.graphics.PixelFormat; 
import android.graphics.Rect; 
import android.graphics.RectF; 
import android.graphics.drawable.Drawable; 
public class GroupMarkerDrawable extends Drawable { 
     private final static int DELTA_BOX = 4; 
     private final Paint m_paint; 
     private String m_text; 
     private double m_pxRadius; 
     public GroupMarkerDrawable(double pxRadius, String text) { 
       m_text = text; 
       m_paint = new Paint(); 
       m_pxRadius = pxRadius; 
       m_paint.setAntiAlias(true); 
     } 
     @Override 
    public void draw(Canvas c) { 
       // Set the correct values in the Paint 
     m_paint.setARGB(190, 0, 0, 0); 
     m_paint.setStrokeWidth(2); 
     m_paint.setStyle(Style.STROKE); 
     m_paint.setTextAlign(Align.CENTER); 
     Rect bounds = new Rect(); 
     m_paint.getTextBounds(m_text, 0, m_text.length(), bounds); 
     int centerX = getBounds().centerX(); 
     int centerY = getBounds().centerY(); 
     int w2 = bounds.width()/2; 
     int h2 = bounds.height()/2; 
     Rect rect = new Rect(centerX - w2 - DELTA_BOX, centerY - h2 - 
DELTA_BOX, centerX + w2 + DELTA_BOX, centerY + h2 + DELTA_BOX); 
     // Draw it 
     c.drawCircle(centerX, centerY, (float) m_pxRadius, m_paint); 
     m_paint.setStyle(Style.FILL); 
     m_paint.setARGB(190, 0, 128, 0); 
     c.drawRect(rect, m_paint); 
     m_paint.setStyle(Style.STROKE); 
     m_paint.setARGB(190, 0, 0, 0); 
     c.drawRect(rect, m_paint); 
     c.drawText(m_text, centerX, centerY + h2, m_paint); 
    } 
     @Override 
     public int getOpacity() { 
       return PixelFormat.OPAQUE; 
     } 
     @Override 
     public void setAlpha(int arg0) { 
     } 
     @Override 
     public void setColorFilter(ColorFilter arg0) { 
     } 
} 

mismo código utilizando dibujable estática de recursos, en lugar de GroupMarkerDrawable, funciona.

Respuesta

2

He encontrado cómo solucionar esto. Solo necesita devolver las dimensiones adecuadas para Drawable. Esto requiere la anulación de dos métodos en GroupMarkerDrawable. Por ejemplo,

@Override 
public int getIntrinsicHeight() { 
    return m_pxRadius * 2; 
}; 

@Override 
public int getIntrinsicWidth() { 
    return m_pxRadius * 2; 
}; 
0

Una solución adicional para un polígono. Las soluciones de ydanila me pusieron en la buena ruta, pero tuve que anular el método hitTest de la clase ItemizedOverlayWithFocus para obtener mi polígono.

Disponibles:

Drawable drawable = new Drawable() { 

    private int mIntrinsicHeight = 0; 
    private int mIntrinsicWidth = 0; 

    @Override 
    public void draw(Canvas canvas) { 
    // used to determine limit coordinates of the drawable 
    int yTop, yBottom, xLeft, xRight; 

    if (points != null && points.size() > 1) { 
     //we have to make a projection to convert from postions on the map in 
     //gradiant to a position on the view in pixels 
     final Projection pj = mapView.getProjection(); 
     Path path = new Path(); 
     Point centerMapPixelPoint = new Point(); 
     Point tmpMapPixelPoint = new Point(); 

     pj.toMapPixels(points.get(0), centerMapPixelPoint); 
     // init limit coordinates 
     xLeft = centerMapPixelPoint.x; 
     xRight = centerMapPixelPoint.x; 
     yTop = centerMapPixelPoint.y; 
     yBottom = centerMapPixelPoint.y; 
     path.moveTo(centerMapPixelPoint.x, centerMapPixelPoint.y); 
     for (int i = 1; i < points.size(); i++) { 
     pj.toMapPixels(points.get(i), tmpMapPixelPoint); 
     // update limit coordinates if necessary 
     if (xLeft > tmpMapPixelPoint.x) { 
      xLeft = tmpMapPixelPoint.x; 
     } 
     if (xRight < tmpMapPixelPoint.x) { 
      xRight = tmpMapPixelPoint.x; 
     } 
     if (yBottom < tmpMapPixelPoint.y) { 
      yBottom = tmpMapPixelPoint.y; 
     } 
     if (yTop > tmpMapPixelPoint.y) { 
      yTop = tmpMapPixelPoint.y; 
     } 
     path.lineTo(tmpMapPixelPoint.x, tmpMapPixelPoint.y); 
     } 
     // close polygon returning to first point 
     path.close(); 

     canvas.drawPath(path, linePaint); 
     canvas.drawPath(path, innerPaint); 
     // calculate drawable height and width 
     mIntrinsicHeight = yTop -yBottom; 
     mIntrinsicWidth = xRight - xLeft; 
    } 
    } 

    @Override 
    public int getIntrinsicHeight() { 
    return mIntrinsicHeight; 
    }; 

    @Override 
    public int getIntrinsicWidth() { 
    return mIntrinsicWidth; 
    }; 

}; 

Superposición:

public class MyItemizedIconOverlay<Item extends OverlayItem> extends ItemizedOverlayWithFocus<Item> { 

    @Override 
    protected boolean hitTest(Item item, Drawable marker, int hitX, int hitY) { 
    boolean hit = false; 

    Rect bounds = marker.getBounds(); 
    if (hitX < bounds.right && hitX > bounds.left && hitY < bounds.top && hitY > bounds.bottom) { 
     hit = true; 
    } else { 
     hit = false; 
    } 


    return hit; 
    }; 
Cuestiones relacionadas