如何实现换行



XNA有Spritefont类,它有一个MeasureString方法,它可以返回string的宽度和高度。我试图了解如何创建一个方法,将有效地返回一个字符串与Environment.Newline插入在正确的地方,使其适合一定的宽度和高度(矩形被用作参数)。

我发现了以下代码:

public string WrapText(SpriteFont spriteFont, string text, float maxLineWidth)
{
    string[] words = text.Split(' ');
    StringBuilder sb = new StringBuilder();
    float lineWidth = 0f;
    float spaceWidth = spriteFont.MeasureString(" ").X;
    foreach (string word in words)
    {
        Vector2 size = spriteFont.MeasureString(word);
        if (lineWidth + size.X < maxLineWidth)
        {
            sb.Append(word + " ");
            lineWidth += size.X + spaceWidth;
        }
        else
        {
            sb.Append("n" + word + " ");
            lineWidth = size.X + spaceWidth;
        }
    }
    return sb.ToString();
}

为了补充Alina的答案,这里是该函数的扩展版本,它也将换行比maxLineWidth

长的单个单词
    public static string WrapText(SpriteFont font, string text, float maxLineWidth)
    {
        string[] words = text.Split(' ');
        StringBuilder sb = new StringBuilder();
        float lineWidth = 0f;
        float spaceWidth = font.MeasureString(" ").X;
        foreach (string word in words)
        {
            Vector2 size = font.MeasureString(word);
            if (lineWidth + size.X < maxLineWidth)
            {
                sb.Append(word + " ");
                lineWidth += size.X + spaceWidth;
            }
            else
            {
                if (size.X > maxLineWidth)
                {
                    if (sb.ToString() == "")
                    {
                        sb.Append(WrapText(font, word.Insert(word.Length / 2, " ") + " ", maxLineWidth));
                    }
                    else
                    {
                        sb.Append("n" + WrapText(font, word.Insert(word.Length / 2, " ") + " ", maxLineWidth));
                    }
                }
                else
                {
                    sb.Append("n" + word + " ");
                    lineWidth = size.X + spaceWidth;
                }
            }
        }
        return sb.ToString();
    }

要处理带有回车符的文本块,需要按如下方式修改代码:

  public static string WrapText(SpriteFont font, string text, float maxLineWidth)
    {
        string[] words = text.Split(' ');
        StringBuilder sb = new StringBuilder();
        float lineWidth = 0f;
        float spaceWidth = font.MeasureString(" ").X;
        foreach (string word in words)
        {
            Vector2 size = font.MeasureString(word);
            if (word.Contains("r"))
            {
                lineWidth = 0f;
                sb.Append("r r" );
            }
            if (lineWidth + size.X < maxLineWidth )
            {
                sb.Append(word + " ");
                lineWidth += size.X + spaceWidth;
            }
            else
            {
                if (size.X > maxLineWidth )
                {
                    if (sb.ToString() == " ")
                    {
                        sb.Append(WrapText(font, word.Insert(word.Length / 2, " ") + " ", maxLineWidth));
                    }
                    else
                    {
                        sb.Append("n" + WrapText(font, word.Insert(word.Length / 2, " ") + " ", maxLineWidth));
                    }
                }
                else
                {
                    sb.Append("n" + word + " ");
                    lineWidth = size.X + spaceWidth;
                }
            }
        }
        return sb.ToString();
    }

最新更新