Osmdroid.onItemSingleTapUp不适用于自定义Drawable

yda*_*ila 5 customization android osmdroid

我创建了自定义drawable标记,它使用canvas绘制边界.一切都很好,除了一件事:当屏幕上的任何标记录音时,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()));
Run Code Online (Sandbox Code Playgroud)

这是自定义绘图标记:

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) { 
        } 
} 
Run Code Online (Sandbox Code Playgroud)

可以使用来自资源的静态drawable而不是GroupMarkerDrawable的相同代码.

yda*_*ila 2

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

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

@Override
public int getIntrinsicWidth() {
    return m_pxRadius * 2;
};
Run Code Online (Sandbox Code Playgroud)