??本系列第一篇文章中創建的基本框架限定了印章形狀為矩形,但常用的印章有方形、圓形等多種形狀,本文調整程序以支持定義并顯示矩形、圓角矩形、圓形、橢圓等4種形式的印章背景形狀。
??定義印章背景形狀枚舉類型,矩形、圓形、橢圓相關的尺寸能夠根據印章寬度、高度計算,但圓角矩形需額外增加圓角半徑尺寸,因此調整印章數據結構定義如下:
public enum BgType
{Rect=0,RoundRect=1,Circle=2,Oval=3
}public class SealInfo
{/// <summary>/// 印章名稱/// </summary>public string Name { get; set; }=string.Empty;/// <summary>/// 印章寬度/// </summary>public float Width { get; set; } = 0;/// <summary>/// 印章高度/// </summary>public float Height { get; set; } = 0;/// <summary>/// 尺寸單位類型,默認為毫米/// </summary>public UnitType UnitType { get; set; } = UnitType.Mm;/// <summary>/// 印章背景色,默認白色/// </summary>public SKColor BgColor { get; set; }=SKColors.White;/// <summary>/// 背景形狀類型/// </summary>public BgType BgType { get; set; } = BgType.Rect;/// <summary>/// 圓角半徑/// </summary>public float CornerRadius { get; set; } = 0;/// <summary>/// 是否有邊框/// </summary>public bool HasBorder { get; set; } = false;/// <summary>/// 邊框寬度/// </summary>public float BorderWidth { get; set; } = 1;/// <summary>/// 邊框顏色/// </summary>public SKColor BorderColor { get;set; } = SKColors.Red;
}
??雖然SKPaint的Style 屬性可以設置同時繪制邊框和底色(值定義為StrokeAndFill),但還沒有在幫助文檔或其它文檔中看到邊框和底色不同顏色時的設置和繪制方式,因此只能采用比較笨的方式,先繪制底色再繪制邊框,同一個繪制函數調用兩次,兩次之間修改繪制方式和繪制顏色。采用SKPath對象保存不同類型的印章形狀,最終調用canvas.DrawPath函數統一繪制底色和邊框,主要代碼如下:
Func<float, int, float> unitConverter = m_currSeal.UnitType == UnitType.Pixel ? CommonFunction.Pixel2Pixel : CommonFunction.MM2Pixel; ;SKCanvas canvas = e.Surface.Canvas;canvas.Clear();SKPaint skPaint = new SKPaint();
skPaint.Style = SKPaintStyle.Fill;
skPaint.Color = m_currSeal.BgColor;float borderWidth = unitConverter(m_currSeal.BorderWidth, skBoard.DeviceDpi);
SKRect rect = new SKRect(borderWidth / 2, borderWidth / 2, unitConverter(m_currSeal.Width, skBoard.DeviceDpi) - borderWidth / 2, unitConverter(m_currSeal.Height, skBoard.DeviceDpi) - borderWidth / 2);SKPath path = new SKPath();switch (m_currSeal.BgType)
{case BgType.Rect:path.AddRect(rect);break;case BgType.RoundRect:path.AddRoundRect(new SKRoundRect(rect, unitConverter(m_currSeal.CornerRadius, skBoard.DeviceDpi)));break;case BgType.Circle:path.AddCircle(rect.MidX, rect.MidY, Math.Min(rect.Height / 2, rect.Width / 2));break;case BgType.Oval:path.AddOval(rect);break;
}canvas.DrawPath(path, skPaint);if(m_currSeal.HasBorder)
{skPaint.StrokeWidth = borderWidth;skPaint.Style = SKPaintStyle.Stroke;skPaint.Color = m_currSeal.BorderColor;canvas.DrawPath(path, skPaint);
}
??最后是程序運行效果,如下圖所示:
參考文獻:
[1]https://learn.microsoft.com/zh-cn/dotnet/api/skiasharp?view=skiasharp-2.88