Sử dụng NGraphics
w/NControl
bạn có thể tạo phiên bản "vectơ" của "đồng hồ đầy đủ" mà không tạo trình kết xuất nền tảng hoặc cần thêm thư viện như Skia
vào dự án của bạn.
Lưu ý: SkiaSharp và các thư viện 2d/3d nguyên bản khác rất tuyệt, nhưng thêm rất nhiều chi phí cho ứng dụng và nếu bạn không cần tất cả các tính năng của chúng thì kích thước ứng dụng, mức sử dụng bộ nhớ, thời gian khởi tạo, v.v. ..) không đáng giá (IMHO).
lại: https://github.com/praeclarum/NGraphics
Tôi lột xuống một MultiSegmentProgressControl
mà tôi đã để cho bạn thấy những điều cơ bản của hồ quang vẽ. Phiên bản đầy đủ mà tôi đã làm cho phép bạn thêm và tạo hoạt ảnh cho nhiều phân đoạn, hiển thị tỷ lệ phần trăm, phân đoạn phá vỡ khi chạm, v.v ...
Sử dụng NControl
bạn có thể tạo điều khiển tổng hợp với các yếu tố cảm ứng, do đó tùy bạn về mức độ cần thiết của bạn.
lại: 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)
);
}
}
Khi sử dụng NGraphics
tôi khuyên bạn nên sử dụng NGraphics.Editor
hay Workbook một Xamarin' tương tác thiết kế kiểm soát của bạn:
tôi sẽ chắc chắn đi cho các hình ảnh khác nhau, thật dễ dàng để thực hiện và tốt đẹp và sạch sẽ về khả năng bảo trì. Điểm bất lợi là nếu bạn cần một quy trình mới, bạn sẽ cần phải tạo lại (hầu hết nếu không phải tất cả) các hình ảnh. Nhưng imo, điều đó tốt hơn rất nhiều công việc để xây dựng một điều khiển phức tạp như vậy với các trình kết xuất tùy chỉnh. –
Cách dễ nhất là tạo các hình ảnh khác nhau và bảo trì dễ dàng ... Nếu bạn muốn điều này theo cách khó khăn hơn, bạn có thể thử SkiaSharp để vẽ 2d https://developer.xamarin.com/guides/cross-platform/drawing/ –
@ DennisSchröer Đó là suy nghĩ đầu tiên của tôi. Nhưng sau đó tôi nhớ có một điều khiển trong Jquery tương tự như thế này. Vì vậy, tôi nghĩ, tôi có thể thử điều đó. Hình ảnh cộng có thể trở nên phức tạp với những thay đổi về độ phân giải của các thiết bị di động khác nhau. Tôi chỉ tìm kiếm một giải pháp có thể. Nếu không, tôi rõ ràng sẽ chỉ làm hình ảnh vì đó dường như là cách lười nhất. – jitendragarg