2

さまざまな角度のいくつかの白い線の端に赤い三角形を描画する Xamarin.iOS CoreGraphics コードがあります。

ここに画像の説明を入力

アウトラインとしてレンダリングする代わりに赤い三角形を塗りつぶしたいのですが、StrokePath() の代わりにグラフィック コンテキスト コマンド FillPath() を使用すると、赤い三角形が表示されません。

ここに画像の説明を入力

DrawArrowHead コードは次のとおりです (個々の線が描画された後、線描画コードによって呼び出されます)。

private void DrawArrowHead(PointF[] line, int size)
{
    // Create the arrowhead and the lines from individual arrowhead points
    PointF[] arrowhead = new PointF[] {
        new PointF(0.0f - size, 0.0f),
        new PointF(0.0f, 0.0f - size),
        new PointF(0.0f + size, 0.0f)
    };

    PointF[] line1 = new PointF[] {new PointF(arrowhead[0].X, arrowhead[0].Y), new PointF(arrowhead[1].X, arrowhead[1].Y)};
    PointF[] line2 = new PointF[] {new PointF(arrowhead[1].X, arrowhead[1].Y), new PointF(arrowhead[2].X, arrowhead[2].Y)};
    PointF[] line3 = new PointF[] {new PointF(arrowhead[2].X, arrowhead[2].Y), new PointF(arrowhead[0].X, arrowhead[0].Y)};

    // Begin drawing the arrowhead
    gctx.SaveState();

    UIColor.Red.SetStroke();
    gctx.SetFillColor(UIColor.Red.CGColor);

    gctx.BeginPath();

    double angleInRadians = Math.Atan2 (line[0].Y - line[1].Y, line[0].X -line[1].X);

    gctx.TranslateCTM(line[1].X, line[1].Y);
    gctx.RotateCTM((float)(angleInRadians -  Math.PI / 2));

    path.AddLines(line1);
    path.AddLines(line2);
    path.AddLines(line3);

    path.CloseSubpath();

    gctx.AddPath(path);

    gctx.StrokePath();

    gctx.RestoreState();
}

gctx.StrokePath() を gctx.FillPath() に置き換えると、白い線が表示されますが、矢印は表示されません。

ここに画像の説明を入力

gctx.StrokePath() を gctx.DrawPath(CGPathDrawingMode.FillStroke) に置き換えると、赤い三角形が表示されますが、塗りつぶされていません。

ここに画像の説明を入力

私が見逃しているのは単純なものだと確信しています。前もって感謝します。

Update - 03.22.13

@poupouの答えは正しかったことがわかりましたが、他のコーディングの「誤解」が加わって、すぐには問題を解決できませんでした。しかし、解決策に向けて正しい方向に私を向けてくれたので、私は彼の答えを受け入れています.

私が最初に CoreGraphics の使い方を学んだのは、Mike Bluestein の優れたDrawing with CoreGraphics in MonoTouchの記事です。しかし、少しの知識は危険なことであり、これらの概念を自分の仕事に適用し始めたとき、意図せずにグラフィックス コンテキストとパス メソッドを混在させてしまいました。

他の人々の CoreGraphics ソース コード (Xamarin の Nina Vyedin と Bryan Costanich の Drawingサンプルの小道具) を何度もグーグル、読み取り、およびレビューした後、機能する DrawArrowhead メソッドを思いつきました。

private void DrawArrowHead(PointF[] line, int size)
{
    gctx.SaveState();
    UIColor.Red.SetStroke();
    UIColor.Red.SetFill();
    double angleInRadians = Math.Atan2 (line[0].Y - line[1].Y, line[0].X -line[1].X);

    gctx.BeginPath();
    gctx.TranslateCTM(line[1].X, line[1].Y);
    gctx.RotateCTM((float)(angleInRadians -  Math.PI / 2));

    PointF[] arrowhead = new PointF[] {
        new PointF (0.0f - arrowHeadSize, 0.0f),
        new PointF (0.0f, 0.0f - arrowHeadSize),
        new PointF (0.0f + arrowHeadSize, 0.0f)
    };

    gctx.MoveTo(arrowhead[0].X, arrowhead[0].Y);
    gctx.AddLineToPoint(arrowhead[1].X, arrowhead[1].Y);
    gctx.AddLineToPoint(arrowhead[2].X, arrowhead[2].Y);

    gctx.ClosePath();                   
    gctx.DrawPath(CGPathDrawingMode.FillStroke);                                   
    gctx.RestoreState();
}

これが最終結果です。

ここに画像の説明を入力

注: DrawArrowHead コードをそのメソッドから UIView の Draw メソッドに移動して、2 番目、3 番目、4 番目、5 番目の線と矢印の組み合わせを描画するときに無効なコンテキスト エラーが発生しないようにする必要がありました (このタイプのエラーについては、こちらを参照してください) 。 .

4

1 に答える 1

1

path.CloseSubpath();aを呼び出すことは、(ストローク/塗りつぶしが行われる場所)CGPathを呼び出すことと同じではありません。後で試しましたか?gctx.ClosePath();CGContext

于 2013-03-21T12:42:24.940 に答える