Osmdroid在标记内插入文本

时间:2015-08-19 07:08:07

标签: android osmdroid

如何在Osmdroid标记内插入文字?假设我需要在地图上放置几个标记,每个标记应该在其中有数字。 enter image description here我怎么能成功?我尝试了for(int i = 0; i < orders.size(); i++) { mOrderPoint = orders.get(i).getStart(); final Order order = orders.get(i); Marker orderMarker = new Marker(mMap); orderMarker.setIcon(ContextCompat.getDrawable(mContext,R.drawable.order_pin)); orderMarker.setPosition(mOrderPoint); } 方法,但它将文字放在气球中。

更新

|

3 个答案:

答案 0 :(得分:8)

此方法从您的资源中获取一个drawable,在其上绘制一些文本并返回新的drawable。您需要做的就是为它提供泡泡的资源ID,以及您想要的文本。然后,您可以将返回的drawable传递到任何您想要的位置。

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);

这可以防止意外调整大小的drawable。

答案 1 :(得分:2)

你想看一下osmdroid奖金包。

网站:https://github.com/MKergall/osmbonuspack

有很多带有文字的程式化气泡的例子。

答案 2 :(得分:0)

The answer by Blue_Alien 不会在 Kotlin 中使用矢量可绘制对象。原因是由于BitmapFactory:它返回一个错误。

如果您使用 kotlin 编程,则有一个比使用 BitmapFactory 简单得多的解决方案。

首先,获取可绘制对象:

val drawable = ContextCompat.getDrawable(context, R.drawable.order_pin)!!

然后只需使用 toBitmap() 函数:

val bitmap = drawable.toBitmap()

然后解决方案的其余部分实际上是相同的。

最终代码:

val drawable = ContextCompat.getDrawable(context, R.drawable.order_pin)!!
val bitmap = drawable.toBitmap()

val paint = Paint(); 
paint.style = Style.FILL  
paint.color = Color.BLACK 
paint.textSize = 20 

val canvas = Canvas(bitmap)
// Note, this code places the text in the center of the Bitmap (both vertically and horizontally)
// https://stackoverflow.com/a/11121873
canvas.drawText(text, bm.width / 2f,
                    bm.height / 2f - (paint.descent() + paint.ascent() / 2), paint)

val iconWithText = BitmapDrawable(context.resources, bitmap)

// Marker has to be initialised somewhere in your code
marker.icon = iconWithText

当然,这个代码如果一次性使用。如果你想把它移动到一个函数,参数可以是 drawable 或 drawableID,它会返回 icon:

return BitmapDrawable(context.resources, bitmap)