我正在使用xamarin和oxyplot库开发Android应用。我遇到了一个问题,我无法在TextAnnotation中添加多行文本。 我尝试了以下选项:
var sb = new StringBuilder();
sb.Append("Line1");
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append("\n");
sb.Append("\r\n");
sb.Append(System.Environment.NewLine);
sb.Append("Line2");
并将其添加到TextAnnotation文本对象中:
var textAnnotation1 = new TextAnnotation();
textAnnotation1.Text = sb.ToString();
textAnnotation1.Background = OxyColors.White;
textAnnotation1.TextColor = OxyColors.Black;
textAnnotation1.FontSize = 18;
textAnnotation1.TextPosition = new DataPoint(4,_vericalLineYaxis);
plotModel.Annotations.Add(textAnnotation1);
但都有用。
我的目标是让文字显示如下:
第1行 第2行
目前它出现在:
第1行第2行
非常感谢任何帮助。
答案 0 :(得分:1)
Android平台目前支持多行注释不。
OxyPlot正在调用Android.Canvas.DrawText
并且该函数不支持文本换行,它是一个相当低级的原始绘图例程。
如果您想修改源代码,可以使用静态布局与当前canvas.DrawText
来完成。
这样的事情会让你开始(但未经测试):
public void DrawText (string text, float x, float y, Paint paint)
{
TextPaint textPaint = new TextPaint();
StaticLayout textLayout = new StaticLayout(text, textPaint, canvas.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, False);
canvas.Save();
canvas.Translate(x, y);
textLayout.Draw(canvas);
canvas.Restore();
}
FYI :Oxyplot的SVG渲染器通过“\ r \ n”上的字符串拆分手动处理多行文本,并为每行渲染一个单独的元素,因此可以为Android做同样的事情使用StaticLayout
(性能较慢,但易于修改/测试):
var lines = Regex.Split(text, "\r\n");
if (valign == VerticalAlignment.Bottom)
{
for (var i = lines.Length - 1; i >= 0; i--)
{
var line = lines[i];
var size = this.MeasureText(line, fontFamily, fontSize, fontWeight);
this.w.WriteText(p, line, c, fontFamily, fontSize, fontWeight, rotate, halign, valign);
p += new ScreenVector(Math.Sin(rotate / 180.0 * Math.PI) * size.Height, Math.Cos(rotate / 180.0 * Math.PI) * size.Height);
}
}