XNA有一个Spritefont类,其中有一个MeasureString方法,可以返回string
的宽度和高度。我正在尝试理解如何创建一个方法,以便有效地返回一个带有正确换行符Environment.Newline
的字符串,使其适合特定的宽度和高度(矩形用作参数)。
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();
}
sb.Append("\r \r");
这一部分呢?它只是在单词之间添加了双倍空格,为什么不是sb.Append("\r");
(在我检查的示例中,没有额外的空格也可以正常工作)? - Ronen Ness