繪制API
首先還是看一下前文的的示例:
args.DrawingSession.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
args.DrawingSession.DrawText("Hello, world!", 100, 100, Colors.Yellow);
它使用了DrawingSesion下發繪制命令,和WPF中的DrawingContext差不多,就是一個繪制上下文。它主要的命令分為如下兩種:DrawXXX和FillXXX。DrawXXX只是繪制圖像,而FillXXX只填充圖像,這里和WPF那種繪制和填充在一個API里的方式稍稍有點不同。
由於API並不多,這里列舉了一下,基本上看着就知道怎么用了。
-
DrawCircle
-
DrawCachedGeometry
-
DrawEllipse
-
DrawGeometry
-
DrawImage
-
DrawInk
-
DrawLine
-
DrawRectangle
-
DrawRoundedRectangle
-
DrawText。
-
DrawTextLayout
-
FillCircle
-
FillEllipse
-
FillGeometry
-
FillRectangle
-
FillRoundedRectangle
它的API還比較簡單,基本上看着就知道怎么用,不過其中的DrawImage能傳入一個IcanvasImage類型,而這個類型並不僅僅是圖片,包括下面介紹的CanvasCommandList和Effect都是這種類型,使用的時候需要熟悉一下。
2D轉換
2D繪圖的過程中往往還伴隨着一些平移,旋轉等2D轉換的操作,DrawingSession中提供了一個Transform屬性可以傳入一個3*2矩陣實現2D轉換。
var ds = args.DrawingSession;
ds.Transform = Matrix3x2.CreateTranslation(new Vector2(200, 100));
ds.DrawText("A", 0, 0, Colors.White);
ds.Transform *= Matrix3x2.CreateRotation(12, new Vector2(200,80));
ds.DrawText("B", 0, 0, Colors.White);
CanvasCommandList
CanvasCommandList可以緩存一組繪制命令,然后統一繪制。它可以用於分塊繪制,也可以用於減少重復繪制。
var renderTarget = new CanvasCommandList(sender);
using (var clds = renderTarget.CreateDrawingSession())
{
clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
clds.DrawText("Hello, world!", 100, 100, Colors.Yellow);
}
args.DrawingSession.DrawImage(renderTarget);
濾鏡效果
Win2D的一個比較給力的特性就是支持濾鏡特效,用它可以非常方便的實現常用的模糊、陰影等效果,這里以高斯模糊為例修改下上面的效果。
var cmdList = new CanvasCommandList(sender);
using (var clds = cmdList.CreateDrawingSession())
{
clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
clds.DrawText("Hello, world!", 100, 100, Colors.Yellow);
}
var effect = new GaussianBlurEffect();
effect.Source = cmdList;
args.DrawingSession.DrawImage(effect);
系統還內置了許多常用的濾鏡效果,它們都以Effect結尾,放在Microsoft.Graphics.Canvas.Effects名字空間下。
繪制事件
除了前面用到的繪制的時候觸發繪制操作的Draw事件外,還有一個比較常用的事件CreateResource,它在最開始加載控件的時候觸發,往往用於初始化各種資源。
另外再來看看Draw事件的觸發條件,它基本上和WPF的OnRender差不多,也就是說,一般在初次加載時會觸發,改變窗口大小的時候會觸發,拖動窗口時不會觸發。如果要在后台控制其重繪也比較簡單,但用其Invalidate方法即可。