2012-05-24 86 views
5

我已創建自定義繪圖標記,它使用畫布繪製 界限。除了一件事以外,一切都很好:onItemSingleTapUp 錄製屏幕上的任何標記時都不會調用。 這裏是疊加創建代碼:Osmdroid。 onItemSingleTapUp不適用於自定義Drawable

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

這是自定義繪製的標記:使用靜態繪製從資源

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) { 
     } 
} 

相同的代碼,而不是 GroupMarkerDrawable,工作。

回答

2

我發現如何解決這個問題。只需要返回Drawable的適當尺寸。這需要在GroupMarkerDrawable中重寫兩個方法。例如:

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

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

一個多邊形的附加解決方案。 ydanila的解決方案讓我走上了良好的軌道,但我不得不重寫ItemizedOverlayWithFocus類的hitTest方法以獲得我的多邊形命中。

繪製對象:

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

}; 

疊加:

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; 
    }; 
相關問題