Строка SVG для Google Maps маркер - PullRequest
1 голос
/ 21 апреля 2020

У меня есть svg, для этого

<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
    <circle cx="20" cy="20" r="20" fill="#FFFFFF" stroke="#000000" stroke-width="1"/>
    <text fill="#FF0000" font-size="12" x="8" y="24">{text}</text>
</svg>

Я хочу поставить его как значок для маркера карты Google. И я хочу изменить текст для каждого маркера. Как я могу это сделать?

UPD

Значок маркера должен быть объектом BitmapDescriptor. Для его создания у меня есть 5 вариантов:

BitmapDescriptorFactory.fromBitmap(Bitmap bitmap);
BitmapDescriptorFactory.fromResource(int resourceId);
BitmapDescriptorFactory.fromAsset(String s);
BitmapDescriptorFactory.fromPath(String s);
BitmapDescriptorFactory.fromFile(String s);

Я думаю, что могу использовать fromPath, но у меня есть исключение:

Failed to decode image. The provided image must be a Bitmap.

Мне нужно преобразовать строку svg в формат, который BitmapDescriptorFactory принимает

1 Ответ

2 голосов
/ 21 апреля 2020

Вы можете сделать это за 3 шага:

1) форматировать String с текстом маркера:

public String formatText(String text) {
    return String.format("<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\">\n" +
            "    <circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"#FFFFFF\" stroke=\"#000000\" stroke-width=\"1\"/>\n" +
            "    <text fill=\"#FF0000\" font-size=\"12\" x=\"8\" y=\"24\">%s</text>\n" +
            "</svg>", text);
}

2) создать растровое изображение из целевого SVG String, например, через SVG.renderToPicture() метод AndroidSVG библиотека:

public Bitmap renderToBitmap(String svgString, int requiredWidth) {
    Bitmap bitmap = null;
    SVG  svg = null;
    try {
        svg = SVG.getFromString(svgString);

        if (requiredWidth < 1) requiredWidth = (int)svg.getDocumentWidth();

        float scaleFactor = (float)requiredWidth / (float)svg.getDocumentWidth();
        int adjustedHeight = (int)(scaleFactor * svg.getDocumentHeight());

        bitmap = Bitmap.createBitmap(requiredWidth, adjustedHeight, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawPicture(svg.renderToPicture(), new Rect(0, 0, requiredWidth, adjustedHeight));
    } catch (SVGParseException e) {
        e.printStackTrace();
    }

    return bitmap;
}

3) добавьте его в качестве значка маркера:

mGoogleMap.addMarker(new MarkerOptions()
        .position(<POSITION>)
        .icon(BitmapDescriptorFactory.fromBitmap(renderToBitmap(formatText("text"), <ICON_WIDTH_IN_PIXELS>)))
        .anchor(0.5f, 0.5f));
...