【发布时间】:2016-06-10 17:08:08
【问题描述】:
我正在尝试创建一个在自定义UIView 子类中绘制多边形的类。我有它的工作,但现在我想通过四舍五入来平滑角落,我不知道该怎么做。这是我目前所拥有的:
public class MyView : UIView
{
private List<CGPoint> points;
public MyView(CGRect frame, List<CGPoint> points) : base (frame)
{
this.points = points;
}
public override Draw (CGRect rect)
{
CGContext context = UIGraphics.GetCurrentContext();
context.SetLineWidth(2);
UIColor.Black.SetStroke();
UIColor.Green.SetFill();
CGPath path = new CGPath();
path.AddLines(points.ToArray());
path.CloseSubpath();
context.AddPath(path);
context.Clip();
using (CGColorSpace rgb = CGColorSpace.CreateDeviceRGB())
{
CGGradient gradient = new CGGradient (rgb, new CGColor[]
{
new CGColor(0, 1, 0),
new CGColor(0, 0.5f, 0),
new CGColor(0, 1, 0),
new CGColor(0, 0.5f, 0)
});
context.DrawLinearGradient(gradient,
new CGPoint (path.BoundingBox.Left, path.BoundingBox.Top),
new CGPoint (path.BoundingBox.Right, path.BoundingBox.Bottom),
CGGradientDrawingOptions.DrawsBeforeStartLocation);
}
}
}
根据我的分数,我明白了:
我尝试过使用path.AddCurveToPoint 和path.AddArc,但我似乎无法让它们按照我想要的方式工作。任何帮助将不胜感激。
编辑
我玩过path.AddCurveToPoint,现在看起来像这样:
它一开始是正确的,但随后就完全发疯了。不知道我在这里做错了什么。这是我更新的Draw 覆盖:
public override Draw (CGRect rect)
{
CGContext context = UIGraphics.GetCurrentContext();
context.SetLineWidth(2);
UIColor.Black.SetStroke();
UIColor.Green.SetFill();
CGPath path = new CGPath();
path.AddLines(points.ToArray());
path.CloseSubpath();
// updated section
int count = points.Count;
for (int x = 1; x < count; x++)
{
var p = points[x];
if (x != 0)
{
var prev = points[x - 1];
if (prev.Y != p.Y)
{
if (prev.Y > p.Y)
{
path.AddCurveToPoint(prev, new CGPoint(p.X - prev.X, p.Y), p);
}
else
{
//???
}
}
}
}
// end updated section
context.AddPath(path);
context.Clip();
using (CGColorSpace rgb = CGColorSpace.CreateDeviceRGB())
{
CGGradient gradient = new CGGradient (rgb, new CGColor[]
{
new CGColor(0, 1, 0),
new CGColor(0, 0.5f, 0),
new CGColor(0, 1, 0),
new CGColor(0, 0.5f, 0)
});
context.DrawLinearGradient(gradient,
new CGPoint (path.BoundingBox.Left, path.BoundingBox.Top),
new CGPoint (path.BoundingBox.Right, path.BoundingBox.Bottom),
CGGradientDrawingOptions.DrawsBeforeStartLocation);
}
}
【问题讨论】:
标签: c# ios xamarin polygon cgpath