IOS Xamarin - 实时绘图画线

时间:2014-02-17 13:20:30

标签: ios plot xamarin.ios xamarin draw

我正在交叉测试项目中实时显示心电图。它在使用Xamarin的Windows和Android上工作正常,但在IOS中我的速度和速度都很慢。

我认为问题是由于我缺乏ios的专业知识。

我做过两次测试都失败了,有人有解决方案加速吗?

测试A

我调用Plot然后将UIImage wBitmap分配为MyView Backgroud每个< 10ms的

    public void Plot(PointF pPrec, PointF pNext)
    {
    SizeF bitmapSize = new SizeF(wBitmap.Size);
    using (CGBitmapContext context2 = new CGBitmapContext(IntPtr.Zero, (int)bitmapSize.Width, (int)bitmapSize.Height, 8, (int)(4 * bitmapSize.Width), CGColorSpace.CreateDeviceRGB(), CGImageAlphaInfo.PremultipliedFirst))
    {
        context2.DrawImage(new RectangleF(0, 0, wBitmap.Size.Width, wBitmap.Size.Height), wBitmap.CGImage);
        context2.SetLineWidth(1);
        context2.AddLineToPoint(pNext.X, pNext.Y);
        context2.DrawPath(CGPathDrawingMode.Stroke);
        // output the drawing to the view
        wBitmap = UIImage.FromImage(context2.ToImage());
    }
}

TEST B

我调用Plot然后将UIImage wBitmap分配为MyView Backgroud每个< 10ms的

    public void Plot2(PointF pPrec, PointF pNext) { UIGraphics.BeginImageContext(wBitmap.Size); context = UIGraphics.GetCurrentContext();
    using (context)
    {
        if (wBitmap != null)
        {
            context.TranslateCTM(0f, wBitmap.Size.Height);
            context.ScaleCTM(1.0f, -1.0f);
            context.DrawImage(new RectangleF(0f, 0f, wBitmap.Size.Width, wBitmap.Size.Height), wBitmap.CGImage);
            context.ScaleCTM(1.0f, -1.0f);
            context.TranslateCTM(0f, -wBitmap.Size.Height);
        } 

        context.SetLineWidth(1);
        context.MoveTo(pPrec.X, pPrec.Y);
        context.AddLineToPoint(pNext.X, pNext.Y);
        context.DrawPath(CGPathDrawingMode.Stroke);

wBitmap = UIGraphics.GetImageFromCurrentImageContext();


    }//end using cont
    UIGraphics.EndImageContext();
}

1 个答案:

答案 0 :(得分:2)

您不需要先绘制位图,然后在视图中使用该位图。正确的方法是继承UIView,然后覆盖Draw()方法并在那里绘制你的东西。

然后,您可以在视图上调用SetNeedsDisplay()来安排重绘。

以下示例绘制箭头形背景:

class YourView: UIView
{
public override void Draw(RectangleF rect)
{
    const float inset = 15f;
    UIColor.Blue.SetFill();
    var path = new UIBezierPath();
    path.MoveTo(new PointF(0, 0));
    path.AddLineTo(new PointF(rect.Width - inset, 0));
    path.AddLineTo(new PointF(rect.Width, rect.Height * 0.5f));
    path.AddLineTo(new PointF(rect.Width - inset, rect.Bottom));
    path.AddLineTo(new PointF(0, rect.Bottom));
    path.AddLineTo(new PointF(0, 0));
    path.Fill();
}
}
}

或者,您可能希望查看现有组件,例如Xamarin Components商店中提供的CorePlotTeeChart。 TeeChart甚至可以跨平台,因此您不必担心Android与iOS。