我需要在自定义标记上绘制文本,这些标记的数量非常多。但问题是,当我在绘制时在Overridden中绘制文本时,所有叠加项目文本看起来都在标记上方的一层中,并且在放大或缩小地图时似乎不会同步。以前我在添加每个项目时调用populate,这个工作正常,但速度太慢了。有什么帮助吗?
在我从ItemizedOverlay扩展的自定义类中,构造函数如下所示,我在其中设置自定义标记:
public HotelMapFilterOverlay(Drawable defaultMarker, final Context con) {
super(boundCenterBottom(defaultMarker));
this.marker = defaultMarker;
this.con = con;
}
和重写的draw方法如下:
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, shadow);
Bitmap bmp = ((BitmapDrawable) marker).getBitmap();
Paint textPaint = new Paint();
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(16f);
textPaint.setTypeface(Typeface.create(Typeface.SANS_SERIF, 1));
textPaint.setStyle(Paint.Style.FILL);
Point screenPts = new Point();
float bmpWidth = bmp.getWidth();
float bmpHeight = bmp.getHeight();
float left;
float top;
int total = mOverlayItems.size();
for (int index = 0; index < total; index++) {
gp = mOverlayItems.get(index).getPoint();
mapView.getProjection().toPixels(gp, screenPts);
left = screenPts.x - (bmpWidth / 2);
top = screenPts.y - bmpHeight;
// draw text
this.title = mOverlayItems.get(index).getTitle();
canvas.drawText(this.title, left + 8, top + 30,textPaint);
}
}
我只调用一次填充来使这个效率像
一样public void callPopulate(){
populate();
}
答案 0 :(得分:1)
要让标记文字在每个标记上单独显示而不是在标记顶部分层,您需要自己绘制标记并删除super.draw(canvas, mapView, shadow)
。
要绘制标记,您已拥有大部分代码!只需创建一个新的Paint markerPaint = new Paint()
对象,然后在绘制文本之前在for循环中添加以下内容:
canvas.drawBitmap(bmp, screenPts.x-(bmp.getWidth()/2), screenPts.y-(bmp.getHeight()), markerPaint);
这样绘制标记然后将其文本绘制在顶部。
关于'populate',您应该在将所有项目添加到ItemizedOverlay后立即调用它。