Как или определить ширину текстового поля SVG или вызвать разрывы строки после 'x' символы?

Простым способом является использование getActivity(). Но я думаю, что основная путаница использования метода getActivity() для получения контекста здесь - исключение нулевого указателя.

Для этого сначала проверьте метод isAdded(), который определит, добавлен он или нет, и затем мы можем использовать getActivity(), чтобы получить контекст Activity.

28
задан Jack Roscoe 29 June 2010 в 15:07
поделиться

2 ответа

Нет атрибута для переноса текста, но есть простой прием, который вы можете использовать. Добавляйте одно слово за раз к текстовому объекту, а когда он становится слишком широким, добавьте перевод строки. Вы можете использовать функцию getBBox () для определения ширины. По сути, вы подражаете старомодной пишущей машинке. Вот пример кода, который сделает это за вас. Вы можете легко превратить это в простую функцию, которая принимает текст и ширину.

var r = Raphael(500, 500);
var t = r.text(100, 100).attr('text-anchor', 'start');
var maxWidth = 100;

var content = "Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate. ";
var words = content.split(" ");

var tempText = "";
for (var i=0; i<words.length; i++) {
  t.attr("text", tempText + " " + words[i]);
  if (t.getBBox().width > maxWidth) {
    tempText += "\n" + words[i];
  } else {
    tempText += " " + words[i];
  }
}

t.attr("text", tempText.substring(1));
47
ответ дан Mark 28 November 2019 в 03:00
поделиться

Решение Марк медленно для больших объемов текста (Firefox 11). Я думаю, что это потому, что текст рендерится несколько раз для получения BBOX. следующая функция более эффективна для больших объемов текста, но, возможно, менее точна (код из проекта Raphaelmarkup ):

/**
 * @param t a raphael text shape
 * @param width - pixels to wrapp text width
 * modify t text adding new lines characters for wrapping it to given width.
 */
rm._textWrapp = function(t, width) {
    var content = t.attr("text");
    var abc="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    t.attr({'text-anchor': 'start', "text": abc});
    var letterWidth=t.getBBox().width / abc.length;
    t.attr({"text": content});
    var words = content.split(" "), x=0, s=[];
    for ( var i = 0; i < words.length; i++) {
        var l = words[i].length;
        if(x+l>width) {
            s.push("\n")
            x=0;
        }
        else {
            x+=l*letterWidth;
        }
        s.push(words[i]+" ");
    }
    t.attr({"text": s.join("")});
};
3
ответ дан cancerbero 28 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: