Android显示在地图上可绘制

时间:2011-03-17 22:44:17

标签: java android google-maps bitmap drawable

我正在尝试在地图视图上显示自定义绘图,但我可以观察到非常奇怪的行为,drawable绘制多次,最糟糕的是它显示错误一次。此drawable显示与ImageView完美,但不像MapView覆盖...

enter image description here

这是我的自定义绘图:

public class CustomDrawable extends Drawable {
    private Bitmap mBitmap;
    private int mWidth;
    private int mHeight;
    private int mDrawLeft;
    private int mDrawTop;
    private int mColor;

    public ChatIconDrawable(Resources res, int color) {
        this.mColor = color;
        this.mBitmap = BitmapFactory.decodeResource(res, R.drawable.chat_icon);
        this.mWidth = mBitmap.getWidth();
        this.mHeight = mBitmap.getHeight();
        setBounds(-mWidth, -mHeight, 0, 0);
    }

    @Override
    public void draw(Canvas canvas) {
        ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
        shapeDrawable.getPaint().setColor(mColor);
        shapeDrawable.setBounds(2 - mWidth, 3 - mHeight, mWidth - 2 - mWidth, mHeight - mHeight / 4 - mHeight);
        shapeDrawable.draw(canvas);
        canvas.drawBitmap(mBitmap, mDrawLeft, mDrawTop, null);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.OPAQUE;
    }

    @Override
    public void setBounds(int left, int top, int right, int bottom) {
        mDrawLeft = left + (right - left - mWidth) / 2;
        mDrawTop = top + (bottom - top - mHeight) / 2;
    }

    @Override
    public void setBounds(Rect bounds) {
        super.setBounds(bounds);
    }

    @Override
    public void setAlpha(int alpha) {
//      throw new UnsupportedOperationException(
//              "Not supported with this drawable");
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
//      throw new UnsupportedOperationException("Not supported with this drawable");
    }

    @Override
    public void setDither(boolean dither) {
//      throw new UnsupportedOperationException("Not supported with this drawable");
    }

    @Override
    public void setFilterBitmap(boolean filter) {
//      throw new UnsupportedOperationException("Not supported with this drawable");
    }

    @Override
    public int getIntrinsicWidth() {
        return mWidth;
    }

    @Override
    public int getIntrinsicHeight() {
        return mHeight;
    }

    @Override
    public int getMinimumWidth() {
        return mWidth;
    }

    @Override
    public int getMinimumHeight() {
        return mHeight;
    }
}

基本上自定义drawable用一些颜色(可能会有所不同)绘制背景,然后在顶部静态位图上绘制以产生正确的数字。

要在地图上绘制这个,我使用ItemizedOverlay。

正如你所看到的那样,这个drawable绘制了多次,并且放置了不同的位置...请建议,因为我不清楚它是什么错误。谢谢。

1 个答案:

答案 0 :(得分:0)

忘记CustomDrawable类。当您在ItemizedOverlay中使用此(或任何其他可绘制)时,叠加层将负责在地图上绘制其“标记”。使用OverlayItem.setMarker(Drawable marker)调用设置标记。因此,除了绘制标记的叠加层外,您的自定义类也在绘制它(在其draw()方法中)。可以在叠加层中调整标记的位置,通常使用例如自定义逐项覆盖的构造函数。

super(boundCenter(defaultMarker));

这使得标记在地理位置上居中,而不是稍微抵消它。