You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin中如何在点A与点B之间绘制曲线?

三点曲线绘制示例

Xamarin 两点间通过控制点绘制曲线实现方案

你已有A、B、C三个点坐标的前提下,最简便的方式是通过二阶贝塞尔曲线实现绘制,C点作为控制点可直接调整曲线的弯曲效果,以下提供两种常用实现方式:

方案1:使用Xamarin.Forms自带Shapes控件(适用于Xamarin.Forms 4.7及以上版本)

无需额外引入第三方库,直接在XAML中声明即可:

<Path Stroke="Blue" StrokeThickness="4">
    <Path.Data>
        <PathGeometry>
            <!-- StartPoint替换为你的A点坐标 -->
            <PathFigure StartPoint="20,50">
                <QuadraticBezierSegment 
                    <!-- Point1替换为你的控制点C坐标 -->
                    Point1="150,20"
                    <!-- Point2替换为你的终点B坐标 -->
                    Point2="300,100"
                />
            </PathFigure>
        </PathGeometry>
    </Path.Data>
</Path>

方案2:使用SkiaSharp绘制(适用于复杂绘图场景)

如果后续还有更多自定义绘图需求,推荐用SkiaSharp实现:

  1. 首先为共享项目和各平台项目安装NuGet包:SkiaSharp.Views.Forms
  2. 在XAML中添加Skia绘制画布:
<ContentPage 
    xmlns:skia="clr-namespace:SkiaSharp.Views.Forms;assembly=SkiaSharp.Views.Forms">
    <skia:SKCanvasView PaintSurface="Canvas_OnPaintSurface" />
</ContentPage>
  1. 后台实现绘制逻辑:
// 替换为你实际获取的三个点坐标
private readonly SKPoint _pointA = new SKPoint(20, 50);
private readonly SKPoint _pointC = new SKPoint(150, 20);
private readonly SKPoint _pointB = new SKPoint(300, 100);

private void Canvas_OnPaintSurface(object sender, SKPaintSurfaceEventArgs e)
{
    var canvas = e.Surface.Canvas;
    // 清空画布
    canvas.Clear(SKColors.White);

    // 配置曲线画笔
    var curvePaint = new SKPaint
    {
        Style = SKPaintStyle.Stroke,
        Color = SKColors.Blue,
        StrokeWidth = 4,
        IsAntialias = true
    };

    // 构建贝塞尔曲线路径
    var path = new SKPath();
    path.MoveTo(_pointA);
    path.QuadTo(_pointC, _pointB);

    // 绘制曲线
    canvas.DrawPath(path, curvePaint);
}

注意事项

如果坐标是基于屏幕的绝对坐标,需要适配不同设备的密度:SkiaSharp中可以通过e.Info.RawSize和控件实际渲染尺寸的比例做坐标缩放,避免不同设备显示效果不一致。

内容的提问来源于stack exchange,提问作者Reza Abbasi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:06:04