。
注:SkiaSharpとその他のネイティブ2D/3Dライブラリは素晴らしいですが、アプリに多くのオーバーヘッドを追加し、すべての機能を必要としない場合は、膨大な(アプリケーションサイズ、メモリ使用量、初期化時間など) ..)それは価値がない(IMHO)。
再:私はあなたに描く弧の基本を表示するためにやったMultiSegmentProgressControl
をストリップダウンhttps://github.com/praeclarum/NGraphics
。私がしたフルバージョンでは、複数のセグメントを追加してアニメートすることができ、パーセンテージを表示したり、接触時にセグメントを区切ったりすることができます。
NControl
を使用すると、タッチ要素でコンポジットコントロールを作成できます。あなたがそれを取る必要があるところまで。
再:https://github.com/chrfalch/NControl
public class MultiSegmentProgressControl2 : NControlView
{
double ringWidth = 50;
double ringInnerWidth = 100;
SolidBrush redBush = new SolidBrush(Colors.Red);
RadialGradientBrush redSegmentBrush = new RadialGradientBrush(
new Point(0.5, 0.5),
new Size(.75, .75),
Colors.LightGray,
Colors.Red);
SolidBrush blueBush = new SolidBrush(Colors.Blue);
RadialGradientBrush blueSegmentBrush = new RadialGradientBrush(
new Point(0.5, 0.5),
new Size(.75, .75),
Colors.LightGray,
Colors.Green);
Tuple<double, double> _redSegment;
public Tuple<double, double> RedSegment { get { return _redSegment; } set { _redSegment = value; Invalidate(); } }
Tuple<double, double> _greenSegment;
public Tuple<double, double> GreenSegment { get { return _greenSegment; } set { _greenSegment = value; Invalidate(); } }
public override void Draw(ICanvas canvas, Rect rect)
{
canvas.FillEllipse(rect.TopLeft, rect.Size, Colors.Gray);
var n = rect;
n.X += ringWidth;
n.Y = n.X;
n.Width -= ringWidth * 2;
n.Height = n.Width;
var i = n;
canvas.FillEllipse(n.TopLeft, n.Size, Colors.LightGray);
n.X += ringInnerWidth;
n.Y = n.X;
n.Width -= ringInnerWidth * 2;
n.Height = n.Width;
canvas.FillEllipse(n.TopLeft, n.Size, Colors.White);
var r = rect.Width/2;
DrawSegment(canvas, rect, ringWidth, redBush, r, _redSegment.Item1, _redSegment.Item2);
DrawSegment(canvas, i, ringInnerWidth, redSegmentBrush, r - ringWidth, _redSegment.Item1, _redSegment.Item2);
DrawSegment(canvas, rect, ringWidth, blueBush, r, _greenSegment.Item1, _greenSegment.Item2);
DrawSegment(canvas, i, ringInnerWidth, blueSegmentBrush, r - ringWidth, _greenSegment.Item1, _greenSegment.Item2);
}
void DrawSegment(ICanvas canvas, Rect rect, double width, Brush brush, double r, double s, double f)
{
canvas.DrawPath(new PathOp[]{
new MoveTo(SegmentEdgePoint(rect.Center, r, s)),
new ArcTo(new Size(rect.Height/2, rect.Width/2), false, true, SegmentEdgePoint(rect.Center, r, f)),
new LineTo(SegmentEdgePoint(rect.Center, r - width, f)),
new ArcTo(new Size(r, r), false, false, SegmentEdgePoint(rect.Center, r - width, s)),
new LineTo(SegmentEdgePoint(rect.Center, r, s)),
new ClosePath()
}, null, brush);
}
Point SegmentEdgePoint(Point c, double r, double d)
{
return new Point(
c.X + r * Math.Cos(d * Math.PI/180),
c.Y + r * Math.Sin(d * Math.PI/180)
);
}
}
NGraphics
を使用している場合、私は非常にインタラクティブに制御を設計するNGraphics.Editor
またはXamarin'ワークブックを使用することをお勧め:
私は間違いだろういろいろなイメージがありますメンテナンス性の面で清潔です。欠点は、新しいプロセスが必要な場合、イメージのすべてではないにしてもほとんどを再作成する必要があることです。しかし、これは、カスタムレンダラを使って複雑なコントロールを作成する作業よりも優れています。 –
最も簡単な方法は、さまざまな画像を作成し、そのメンテナンスを簡単にすることです。これをもっと難しくしたい場合は、2D図面用にSkiaSharpを試すことができます。https://developer.xamarin.com/guides/cross-platform/drawing/ –
@ DennisSchröerそれは私の最初の考えだったです。しかし、私はJqueryのコントロールがこれに似ていることを思い出しました。だから、私はそれを試すことができると思った。プラスの画像は、さまざまなモバイルデバイスの解像度の変更に伴いトリッキーになる可能性があります。私は可能な解決策を探しています。さもなければ、私は明らかに怠惰な方法であるようにイメージを行うだけです。 – jitendragarg