2012-05-24 21 views
5

Tôi đã tạo điểm đánh dấu có thể vẽ tùy chỉnh sử dụng canvas để vẽ các đường viền . Tất cả mọi thứ hoạt động tuyệt vời excepts một điều: onItemSingleTapUp không được gọi khi bất kỳ điểm đánh dấu trên màn hình ghi âm. Đây là mã tạo lớp phủ:Osmdroid. onItemSingleTapUp không hoạt động cho tùy chỉnh Có thể vẽ

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

Đây là tùy chỉnh drawable marker:

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

Cùng mã sử dụng drawable tĩnh từ các nguồn lực, thay vì GroupMarkerDrawable, hoạt động.

Trả lời

2

Tôi đã tìm cách giải quyết vấn đề này. Chỉ cần trả về kích thước phù hợp cho Drawable. Điều này đòi hỏi trọng số của hai phương thức trong GroupMarkerDrawable. Ví dụ FOr như sau:

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

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

Giải pháp bổ sung cho đa giác. Các giải pháp của ydanila đưa tôi đi đúng hướng nhưng tôi phải ghi đè phương pháp hitTest của lớp ItemizedOverlayWithFocus để có được đa giác của tôi trúng.

drawable:

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

}; 

Overlay:

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; 
    }; 
Các vấn đề liên quan