5

我创建了使用画布绘制边界的自定义可绘制标记。一切都很好,除了一件事:当屏幕上的任何标记被录音时,不会调用 onItemSingleTapUp。这是覆盖创建代码:

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 的相同代码有效。

4

2 回答 2

2

我找到了解决这个问题的方法。只需要为 Drawable 返回正确的尺寸。这需要重写 GroupMarkerDrawable 中的两个方法。例如像这样:

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

@Override
public int getIntrinsicWidth() {
    return m_pxRadius * 2;
};
于 2012-05-31T10:58:48.753 回答
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;
  };
于 2012-06-15T09:48:45.497 回答