在Oxyplot TextAnnotation中显示多行文本

时间:2016-05-07 20:29:33

标签: android xamarin oxyplot

我正在使用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行

非常感谢任何帮助。

1 个答案:

答案 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);
    }
}