2012-05-24 16 views
5

के लिए काम नहीं करता है मैंने कस्टम ड्रॉइंग मार्कर बनाया है जो सीमाओं को खींचने के लिए कैनवास का उपयोग करता है। सबकुछ बढ़िया काम करता है एक चीज़ को छोड़ देता है: ITemSingleTapUp स्क्रीन पर किसी भी मार्कर को टैप करने पर नहीं कहा जाता है।ओस्डड्रॉइड। 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())); 

यह कस्टम drawable मार्कर है: यहाँ ओवरले निर्माण कोड है

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

एक ही कोड संसाधनों से स्थिर drawable का उपयोग कर, GroupMarkerDrawable के बजाय, काम करता है।

उत्तर

2

मुझे यह पता चला कि यह कैसे हल किया जाए। ड्राइंग के लिए बस उचित आयाम वापस करने की जरूरत है। GroupMarkerDrawable में दो विधियों को ओवरराइड करने की आवश्यकता है। इस तरह के उदाहरण के लिए:

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

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

बहुभुज के लिए एक अतिरिक्त समाधान। यडानिला के समाधान ने मुझे अच्छे ट्रैक पर रखा लेकिन मुझे बहुभुज हिट पाने के लिए आइटमइज्ड ओवरलेविथफोकस क्लास की हिटटेस्ट विधि को ओवरराइड करना पड़ा।

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

}; 

ओवरले:

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; 
    }; 
संबंधित मुद्दे