さまざまな角度のいくつかの白い線の端に赤い三角形を描画する 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 番目の線と矢印の組み合わせを描画するときに無効なコンテキスト エラーが発生しないようにする必要がありました (このタイプのエラーについては、こちらを参照してください) 。 .