我正在尝试在地图视图上显示自定义绘图,但我可以观察到非常奇怪的行为,drawable绘制多次,最糟糕的是它显示错误一次。此drawable显示与ImageView完美,但不像MapView覆盖...
这是我的自定义绘图:
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绘制了多次,并且放置了不同的位置...请建议,因为我不清楚它是什么错误。谢谢。
答案 0 :(得分:0)
忘记CustomDrawable类。当您在ItemizedOverlay中使用此(或任何其他可绘制)时,叠加层将负责在地图上绘制其“标记”。使用OverlayItem.setMarker(Drawable marker)调用设置标记。因此,除了绘制标记的叠加层外,您的自定义类也在绘制它(在其draw()方法中)。可以在叠加层中调整标记的位置,通常使用例如自定义逐项覆盖的构造函数。
super(boundCenter(defaultMarker));
这使得标记在地理位置上居中,而不是稍微抵消它。