将图像和文本组合成可绘制对象

24
我想创建一个可绘制对象,它由一个地图标记(气泡)和一些文本组成。气泡应该在背景中,文本应该在前景中。
这个可绘制对象应该被传递给类BalloonItemizedOverlaysuper(drawable)中,该类扩展了ItemizedOverlay<Item>
换句话说,我想在地图上显示出现在气泡中的文本。
我正在使用Hello Mapview tutorial

2
给我们一些代码!至少试着写出你在这里解释的内容,我们会帮忙。 - iTurki
感谢您的快速回复,实际上我想在以下类中传递包含文本的可绘制对象:MyItemizedOverlay,它扩展了ItemizedOverlay<Item>。代码如下: itemizedOverlay = new MyItemizedOverlay(drawable,mapView);point= new GeoPoint((int)(Search.slat[i]*1E6),(int)(Search.slon[i]*1E6)); OverlayItem overlayItem = new OverlayItem( point, Search.address[i], Search.city[i]); - Abhi
请问您能否更新一下您的问题并附上代码吗?这样看起来会更容易阅读。 - iTurki
我想添加文本,有没有办法在运行时创建包含图像(气泡)作为背景和一些文本的可绘制对象,以便我可以将可绘制对象(带有图像和文本)传递给super(),在地图上显示为气泡。谢谢。 - Abhi
1个回答

64

此方法从您的资源中获取一个可绘制项,将一些文本绘制在其顶部并返回新的可绘制项。您需要做的就是提供气泡的资源ID和您想要在其上面显示的文本,然后可以将返回的可绘制项传递到任何您想要的地方。

public BitmapDrawable writeOnDrawable(int drawableId, String text){

        Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId).copy(Bitmap.Config.ARGB_8888, true);
        Paint paint = new Paint(); 
        paint.setStyle(Style.FILL);  
        paint.setColor(Color.BLACK); 
        paint.setTextSize(20); 

        Canvas canvas = new Canvas(bm);
        canvas.drawText(text, 0, bm.getHeight()/2, paint);

        return new BitmapDrawable(bm);
    }
为了保持密度,您需要使用这个构造函数。
BitmapDrawable (Resources res, Bitmap bitmap)
所以,保持您的上下文,最后一个返回应该是类似这样的东西
return new BitmapDrawable(context.getResources(), bm);

这可以防止不必要的调整大小。


非常感谢。它运行良好。再次感谢您的快速回复。在我的drwable中,我将文本设置为123,但只显示1。我认为是因为尺寸太小,只显示一个数字。您认为我应该增加大图像还是如何增加大小或是否存在其他问题?谢谢。 - Abhi
你可以增加气泡的大小或减小文本的大小。正如你所看到的,文本现在设置为大小20,你可以尝试使用10。 - Marmoy
3
想要评论一下,这并不适用于使用XML定义的可绘制对象。因为那种可绘制对象是GradientDrawable。 - Etienne Lawlor
这是一个很好的回答,但是文字不在位图的中心位置(即使我已将canvas.drawText()的第二个参数从0改为bm.getWidth()/2,而且我的图片高度和宽度相等,我该怎么办?这很紧急,请帮忙!!!) - Vishal Pandey
@Vishal_Pandey 如果你想让整个文本居中,你需要从结果文本的宽度和高度中减去一半,并将其与中心坐标对齐;否则,你只是将文本的左上角设置为可绘制区域的中心。 - straya
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接